我正在为CMake配置我的项目,并且有链接问题 - 项目文件全部编译成功,然后它说它正在链接并报告找不到的各种符号。CMake链接失败
这些符号大部分由我自己的代码提供,而其中一些代码由BerkeleyDB提供,它们的位置和位置正确。
这里是我的顶层的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")
这里是我的SRC级的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})
输出(部分):
...
[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
...
所有符号确实存在。结果似乎发生在目标文件以外的目标文件中的符号上。
从输出 “的cmake ../”(从安装,在顶级目录):
=> 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
任何帮助非常赞赏。
我意识到$ {libdb_INCLUDE_DIRS}和$ {libdb_INCLUDE_LIBRARIES}是错误的,我需要$ {BerkeleyDB_INCLUDE_DIRS}和$ {BerkeleyDB_LIBRARIES},但是修正了我仍然存在的问题。 – Asher 2010-07-22 05:44:15
基于另一篇文章(http://stackoverflow.com/questions/1962453/cmake-finds-boost-but-nmake-fails-to-link)我添加了一行:MESSAGE(STATUS“libs:$ {BerkeleyDB_LIBRARIES} “); $ {BerkeleyDB_LIBRARIES}和$ {LIBS}都不会打印任何内容。这似乎是我的问题 - 但为什么? – Asher 2010-07-22 05:45:33
之前的评论其实是不正确的;我需要使用$ {DB_LIBRARIES};现在我得到的输出为$ {LIBS},但我仍然有相同的链接问题。我已经开始使用全新的安装目录来测试它。尝试了VERBOSE = 1并没有看到任何不同;现在我将更仔细地检查CMakeCache.txt。 – Asher 2010-07-22 18:06:18