使用CMake生成的库上的链接器错误
我是CMake的新手,尝试编写一个简单的静态库,使用Qt4进行一些图像处理使用CMake生成的库上的链接器错误,cmake,static-libraries,static-linking,Cmake,Static Libraries,Static Linking,我是CMake的新手,尝试编写一个简单的静态库,使用Qt4进行一些图像处理 cmake_minimum_required(VERSION 2.8) project(timage) find_package(Qt4 REQUIRED) include(${QT_USE_FILE}) add_definitions(${QT_DEFINITIONS}) include_directories( "${PROJECT_SOURCE_DIR}/include" ) add_library(
cmake_minimum_required(VERSION 2.8)
project(timage)
find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
add_definitions(${QT_DEFINITIONS})
include_directories(
"${PROJECT_SOURCE_DIR}/include"
)
add_library(
timage
${PROJECT_SOURCE_DIR}/source/timage.cpp
)
target_link_libraries(
timage
${QT_LIBRARIES}
)
我可以配置并生成它,它甚至成功地构建了libtimage.a
。现在我想把它包括在我的主要项目中,麻烦就从这里开始
我从一些单元测试开始,但是我已经得到了链接器错误(TImage
类的每个函数调用的undefined reference
)。我用g++-Wall-Wextra-std=c++11-I../include-L../bin-ltimage-o test spec.cpp构建单元测试
我个人看不出除了Qt4工作之外,我正在做的工作之间有什么区别。如果有人能给我一个正确方向的提示,我将不胜感激
更新
我刚刚发现,如果我使用此CMake文件构建测试:
link_directories(
${PROJECT_BINARY_DIR}
)
add_definitions("-std=c++11")
add_executable(
test
spec.cpp
)
target_link_libraries(
test
timage
)
一切正常。我目前正试图找出CMake在做什么,而我不是。您的问题是libtimage.a可能不在./bin
中,但默认情况下将位于${PROJECT\u BINARY\u DIR}
-您的构建目录中
在g++命令中,您正在向库搜索路径添加。/bin
,但需要在${PROJECT\u BINARY\u DIR}
所在的位置添加
这是在命令中的第二个CMakeLists文件中实现的。但是,通常最好避免使用此命令(文档解释了原因)
如果测试的CMakeLists.txt中提供了timage
作为CMake目标,则无需使用link\u目录
-CMake已经知道在哪里可以找到构建的库,并将自动传递相应的-L
标志。“CMake target”是指使用add\u library
命令在该文件或父CMakeLists.txt中定义
如果timage
不是测试CMakeLists.txt中的实际CMake目标(即,它是一个完全独立的项目,不从公共父CMakeLists.txt调用),那么您有两个选项
您可以使用timage
项目,以便测试项目可以使用导入它,或者您可以单独构建库,然后让测试人员使用查找它。这将生成libtimage.a的完整路径(如果找到)
所有这些选项都可以避免您必须使用link\u目录
另一点是,通过执行以下操作,您可以确切地看到构建命令CMake正在调用什么
make VERBOSE=1
因此,在构建测试时,可以将CMake生成的命令与您自己的命令进行比较