我有以下目录结构:
-project
-helper
-build
-include
-h_a.h
-h_b.h
-src
-h_a
-h_a.cpp
-CMakeLists.txt
-h_b
-h_b.cpp
-CMakeLists.txt
-CMakeLists.txt
-proj_c
-build
-src
-main.cpp
-CMakeLists.txt
在helper
项目中,将生成两个库:libh_a.a
和libh_b.a
。libh_a.a
用于建造libh_b.a
。这些文件如下:
helper/src/CMakeLists.txt:
cmake_minimum_required(VERSION 2.6)
project(helper)
set(CMAKE_CXX_FLAGS "-Wall -g -std=c++11")
add_subdirectory(h_a)
add_subdirectory(h_b)
helper/src/h_a/CMakeLists.txt:
project(h_a)
add_library(h_a h_a.cpp)
helper/src/h_a/h_a.cpp
void func_a(){}
helper/src/h_b/CMakeLists.txt:
project(h_b)
add_library(h_b h_b.cpp)
target_link_libraries(
h_b STATIC
h_a
)
helper/src/h_b/h_b.cpp:
#include "../../include/h_a.h"
void func_b(){
func_a();
}
proj_c/src/CMakeLists.txt:
cmake_minimum_required(VERSION 3.2)
project(proj_c)
find_library(h_a PATHS ../../helper/build/h_a)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../helper/build/h_a)
find_library(h_b PATHS ../../helper/build/h_b)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../helper/build/h_b)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../bin/")
add_executable(proj_c main.cpp)
target_link_libraries(
proj_c
h_a
h_b
)
proj_c/src/main.cpp:
#include "../../helper/include/h_b.h"
int main(){
func_b();
}
首先,我跑cmake ../src
的helper/build
(没有错误形式交往),比cmake ../src
从proj_c/build
和我
proj_c/src/../../helper/build/h_b/libh_b.a(h_b.cpp.o): In function `func_b()':
helper/src/h_b/h_b.cpp:4: undefined reference to `func_a()'
看来问题出在h_b.cpp
,但libh_b.a
先前是没有错误建立的。
第一个问题是找不到您的库。在proj_c/build/CMakeCache.txt
:
//Path to a library.
h_a:FILEPATH=h_a-NOTFOUND
//Path to a library.
h_b:FILEPATH=h_b-NOTFOUND
(使用该DOC
选项find_library()
获取通用的“库的路径”,并替换为更有用的内容。)
可以通过在以下位置添加检查来克服这种“无提示的失败” find_library()
:
if ( NOT h_a )
message( FATAL_ERROR "Library h_a not found in ${CMAKE_CURRENT_SOURCE_DIR}/../../helper/build/h_a" )
endif()
(对于较大的项目,您将FindXyz.cmake
设置一个模块来查找依赖关系,可以通过调用该模块find_package( Xyz REQUIRED )
来避免出现静默故障。但是,编写这样的模块时,以及您可以使用的辅助功能都是其自身的主题。)
失败本身是由于您使用以下问题find_library
:
find_library(h_a PATHS ../../helper/build/h_a)
你告诉CMake的哪里寻找,并在其中变量存储结果,而不是要寻找什么的。
使用:
find_library(h_a NAMES h_a PATHS ../../helper/build/h_a)
这样可以解决-NOTFOUND
。(也申请h_b
。)
由于...,您仍然会收到链接器错误。
target_link_libraries(
proj_c
h_a
h_b
)
...链接顺序。proj_c
验看func_b()
,没有找到它h_a
,确实发现它h_b
,这反过来要求func_a()
,未发现因为链接正在上只有库列表中的一个通行证。
与-lh_a -lh_b
在命令行上指定相同。
根据依赖关系链切换库(proj_c
取决于h_b
取决于h_a
):
target_link_libraries(
proj_c
h_b
h_a
)
那可行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句