I'm configuring my project for CMake and am having linking problems - the project files all compile successfully, then it says it is linking and reports all sorts of symbols not found.
These symbols are mostly provided by my own code, while some of them are provided by BerkeleyDB, which is being properly located and included.
Here is my top-level CMakeLists.txt:
cmake_minimum_required(VERSION 2.6)
project( rpdb C )
# add local modules path for project
set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/" )
# where to look for source files (headers and source)
include_directories( include src )
# define sub-directories of source that cmake knows about as well a where their output will be put
add_subdirectory( src bin )
# compiler-dependent flags:
if( CMAKE_COMPILER_IS_GNUCC )
# gcc
add_definitions( -ggdb -fsigned-char -freg-struct-return -Wall -W -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Winline -Werror )
else( CMAKE_COMPILER_IS_GNUCC )
# non-gcc (intended for clang)
add_definitions( -ggdb -fsigned-char -Wall -W -Wshadow -Wstrict-prototypes -Wpointer-arith -Wcast-qual -Winline -Werror )
endif( CMAKE_COMPILER_IS_GNUCC )
# distribution configuration
set(CMAKE_C_FLAGS_DISTRIBUTION "-O3")
set(CMAKE_CXX_FLAGS_DISTRIBUTION "-O3")
And here is my src-level CMakeLists.txt:
# make sure we have libdb
find_package( BerkeleyDB REQUIRED )
include_directories( ${libdb_INCLUDE_DIRS} )
target_link_libraries( rpdb ${libdb_LIBRARIES} )
# define variable specifying included source files - all .c files below this directory
file( GLOB rpdb_src "**/*.c" )
# define shared library with sources
add_library( rpdb SHARED ${rpdb_src} )
The output (partial):
...
[100%] Building C object bin/CMakeFiles/rpdb.dir/RPDB_TransactionController/RPDB_TransactionController.c.o
Linking C shared library librpdb.dylib
Undefined symbols:
"_RPDB_ReplicationVerbositySettingsController_displayMessageProcessingInformation", referenced from:
_RPDB_SettingsController_internal_setVerbosity in RPDB_SettingsController.c.o
...
All of the symbols do actually exist. The result seems to occur for symbols in object files other than the one it is currently looking at.
The output from "cmake ../" (from install, a directory in the top-level):
=> cmake ..
-- Found BerkeleyDB: /usr/local/lib/libdb.dylib
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/ahaig/Projects/RPDB/RPDB_C/install
Any help much appreciated.