使用CMake构建的库上的链接器错误

时间:2012-08-29 18:43:21

标签: 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(
    timage
    ${PROJECT_SOURCE_DIR}/source/timage.cpp
)
target_link_libraries(
    timage
    ${QT_LIBRARIES}
)

我可以配置并生成它,甚至可以成功构建libtimage.a。现在我想将它包含在我的主项目中,这就是麻烦开始的地方。

我从一些单元测试开始,但是我已经为undefined reference类的每个函数调用得到了链接器错误(TImage)。我使用g++ -Wall -Wextra -std=c++11 -I../include -L../bin -ltimage -o test spec.cpp

构建了单元测试

除了Qt4的工作之外,我个人看不到我对beginner's tutorial所做的事情之间的区别。如果有人能给我一个正确方向的提示,我将不胜感激。

更新 我刚刚发现,如果我用这个CMake文件构建我的测试:

link_directories(
    ${PROJECT_BINARY_DIR}
)
add_definitions("-std=c++11")
add_executable(
    test
    spec.cpp
)
target_link_libraries(
    test
    timage
)

一切都按预期工作。我目前正试图找出CMake正在做的事情,我不是。

1 个答案:

答案 0 :(得分:2)

您的问题是libtimage.a可能不在../bin中,但默认情况下会在${PROJECT_BINARY_DIR} - 您的构建目录中。

在您的g ++命令中,您要将../bin添加到图书馆搜索路径,但您需要在${PROJECT_BINARY_DIR}的任何位置添加。

这是在link_directories命令中的第二个CMakeLists文件中实现的。但是,通常最好避免使用此命令(文档解释了原因)。

如果您的测试CMakeLists.txt中的timage可用作CMake目标,则无需使用link_directories - CMake已知道在哪里可以找到构建的库并将传递相应的{{ 1}}自动标记。 “CMake target”是指它使用-L命令在该文件或父CMakeLists.txt中定义。

如果add_library不是测试CMakeLists.txt中的实际CMake目标(即它是一个完全独立的项目,不是从公共父CMakeLists.txt调用的),那么你有几个选项

您可以export timage项目,以便测试项目可以使用include导入它,或者您可以单独构建库,然后让测试使用{{{}找到它3}}。如果找到libtimage.a,这将产生完整的路径。

所有这些选项都可以避免您使用timage

另一点是你可以通过

确切地看到CMake正在调用的构建命令
link_directories

因此,在构建测试时,可以将CMake生成的命令与您自己的命令进行比较。