Je configure mon projet pour CMake et j'ai des problèmes de liaison - les fichiers du projet se compilent tous avec succès, puis il dit qu'il relie et signale toutes sortes de symboles non trouvés.CMake Liaison échoue
Ces symboles sont principalement fournis par mon propre code, alors que certains d'entre eux sont fournis par BerkeleyDB, qui est correctement localisés et inclus.
Voici mon CMakeLists.txt haut niveau:
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")
Et voici mon niveau 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})
La sortie (partielle):
...
[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
...
Tous les symboles existent réellement. Le résultat semble se produire pour les symboles dans les fichiers objets autres que celui actuellement en cours de visualisation.
La sortie de "cmake ../" (à partir de l'installation, un répertoire dans le haut niveau):
=> 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
Toute aide très appréciée.
je me suis rendu $ {libdb_INCLUDE_DIRS} et $ {libdb_INCLUDE_LIBRARIES} eu tort et que J'avais besoin de $ {BerkeleyDB_INCLUDE_DIRS} et de $ {BerkeleyDB_LIBRARIES} à la place, mais après avoir résolu que j'avais toujours le même problème. – Asher
Basé sur un autre post (http://stackoverflow.com/questions/1962453/cmake-finds-boost-but-nmake-fails-to-link) J'ai ajouté une ligne: MESSAGE (STATUS "libs: $ {BerkeleyDB_LIBRARIES} "); $ {BerkeleyDB_LIBRARIES} et $ {LIBS} n'impriment rien. Cela me semble être le problème - mais pourquoi? – Asher
Les commentaires précédents étaient en fait incorrects; J'avais besoin d'utiliser $ {DB_LIBRARIES}; maintenant je reçois la sortie pour $ {LIBS}, mais j'ai toujours le même problème de lien. J'ai commencé avec un nouveau répertoire d'installation pour le tester. Essayé VERBOSE = 1 et ne vois rien de différent; Maintenant, je vais examiner le CMakeCache.txt de plus près. – Asher