我是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正在做的事情,我不是。
答案 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生成的命令与您自己的命令进行比较。