0

我对 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 工作之外,我个人看不出我对初学者教程所做的工作之间的区别。如果有人可以在这里给我一个正确方向的提示,我将不胜感激。

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

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

一切都按预期工作。我目前正在尝试找出 CMake 在做什么,而我不是。

4

1 回答 1

2

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

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

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

如果timage在您的测试的 CMakeLists.txt 中作为 CMake 目标可用,则无需使用link_directories- CMake 已经知道在哪里可以找到构建的库,并且会-L自动传递适当的标志。“CMake 目标”是指使用该add_library命令在该文件或父 CMakeLists.txt 中定义的。

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

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

所有这些选项都将避免您必须使用link_directories.

另一点是,您可以通过执行确切地看到 CMake 正在调用的构建命令

make VERBOSE=1

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

于 2012-08-29T22:10:55.397 回答