问题描述
对于我的项目,我需要构建并包含另一个库https://github.com/t-dillon/tdoku/作为依赖项。
Toku也使用CMake构建,并且可以通过执行以下构建脚本来运行:
protected
这会将库文件放在class Rectangle: public Shape {
public:
using Shape::setWidth;
using Shape::setHeight;
int getArea() const {
return (width * height);
}
};
中。
我正在尝试在CMake中构建Toku库,并将其用作依赖项。我该怎么办?
我尝试使用$ cd lib/toku
$ ./BUILD.sh
,./lib/tdoku/build/libtdoku.a
,add_custom_target
,add_custom_command
无济于事。
我当前的add_dependencies
如下:
add_subdirectory
解决方法
在@Tsyvarev的帮助下,我首先将CMakeLists.txt
更改为:
add_custom_command(
OUTPUT ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a
COMMAND ${CMAKE_SOURCE_DIR}/lib/tdoku/BUILD.sh tdoku
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lib/tdoku
)
add_custom_target(project DEPENDS ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a)
关键是WORKING_DIR
不起作用,而我需要拥有WORKING_DIRECTORY
。我通过尝试修改build.sh
脚本并将其将内容打印到文件中来弄清楚了这一部分,因此我可以知道它是否正在运行,以及脚本内部有什么中断。我意识到脚本的工作目录是错误的。
实际上,我相信我在发布问题之前就已经做了所有这些事情,但是之后出现了以下错误,这使我认为tdoku
库没有正确编译。是的,但是它未正确链接到我的项目:
/usr/bin/ld: /usr/bin/ld: DWARF error: could not find variable specification at offset 223f
/usr/bin/ld: DWARF error: could not find variable specification at offset 22ba
我用Google搜索了"DWARF error: could not find variable specification"
,这导致我进入ld.exe: DWARF error: could not find variable specification at offset 101cee。谷歌搜索cmake flto
带我去How do I enable link time optimization (LTO) with CMake?。
这终于使我能够编译项目。
整个更改列表包括:
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
add_custom_command(
OUTPUT ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a
COMMAND ${CMAKE_SOURCE_DIR}/lib/tdoku/BUILD.sh tdoku
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/lib/tdoku
)
add_custom_target(project DEPENDS ${CMAKE_SOURCE_DIR}/lib/tdoku/build/libtdoku.a)