Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CMake生成的库上的链接器错误_Cmake_Static Libraries_Static Linking - Fatal编程技术网

使用CMake生成的库上的链接器错误

使用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的新手,尝试编写一个简单的静态库,使用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(
    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生成的命令与您自己的命令进行比较