使用自己的库使用cmake进行未定义的引用

罗伯特

我有以下目录结构:

-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.alibh_b.alibh_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 ../srchelper/build(没有错误形式交往),比cmake ../srcproj_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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用cmake共享库的未定义引用

来自分类Dev

使用cmake共享库的未定义引用

来自分类Dev

使用cmake对espeak的未定义引用

来自分类Dev

未定义对使用CMake生成为lib .a的方法的引用

来自分类Dev

OpenCV:使用cmake时对`cv :: imread的未定义引用

来自分类Dev

在C ++中使用库时“未定义的引用”

来自分类Dev

在C ++中使用库时出现“未定义的引用”

来自分类Dev

使用g ++进行编译时“未定义的引用”

来自分类Dev

CMake:未定义的引用

来自分类Dev

使用SDL 2和-static进行编译时,是否收到对各种Windows库的未定义引用?

来自分类Dev

使用avr-gcc编译器/链接器对链接的avrfix库中的函数进行未定义的引用

来自分类Dev

使用libav的未定义引用蚀

来自分类Dev

使用未定义的引用运行函数

来自分类Dev

在Windows中使用CMake(mingw)在Qt5.14.0 static中未定义的引用

来自分类Dev

无法使用cmake编译项目-未定义对`ns_initparse'的引用

来自分类Dev

为什么cmake在Windows上使用cygwin给出netcdf的未定义引用?

来自分类Dev

链接自己依赖于静态库的静态库时未定义的引用

来自分类Dev

使用带有CMake和Conan的外部库的未定义参考

来自分类Dev

未定义对功能CMake的引用

来自分类Dev

MinGW / CMake对ZLib的未定义引用

来自分类Dev

CMake 对类的未定义引用

来自分类Dev

使用cblas库时出现“对'cblas_ddot'的未定义引用”

来自分类Dev

与使用名称空间的外部库链接时,如何解决C中的未定义引用?

来自分类Dev

使用makefile与带有OTL的静态库链接时未定义的引用

来自分类Dev

使用带有外部 C++ 库的 Rcpp 构建 R 包时未定义的引用

来自分类Dev

在Linux上使用`libc ++`进行编译时,对`__cxa_thread_atexit @@ CXXABI`的未定义引用

来自分类Dev

使用类进行链接时发生简单的C ++未定义引用错误

来自分类Dev

对共享库main的未定义引用

来自分类Dev

C ++在ubuntu下用cmake链接boost库:对`boost :: iostreams :: zlib :: okay'的未定义引用

Related 相关文章

  1. 1

    使用cmake共享库的未定义引用

  2. 2

    使用cmake共享库的未定义引用

  3. 3

    使用cmake对espeak的未定义引用

  4. 4

    未定义对使用CMake生成为lib .a的方法的引用

  5. 5

    OpenCV:使用cmake时对`cv :: imread的未定义引用

  6. 6

    在C ++中使用库时“未定义的引用”

  7. 7

    在C ++中使用库时出现“未定义的引用”

  8. 8

    使用g ++进行编译时“未定义的引用”

  9. 9

    CMake:未定义的引用

  10. 10

    使用SDL 2和-static进行编译时,是否收到对各种Windows库的未定义引用?

  11. 11

    使用avr-gcc编译器/链接器对链接的avrfix库中的函数进行未定义的引用

  12. 12

    使用libav的未定义引用蚀

  13. 13

    使用未定义的引用运行函数

  14. 14

    在Windows中使用CMake(mingw)在Qt5.14.0 static中未定义的引用

  15. 15

    无法使用cmake编译项目-未定义对`ns_initparse'的引用

  16. 16

    为什么cmake在Windows上使用cygwin给出netcdf的未定义引用?

  17. 17

    链接自己依赖于静态库的静态库时未定义的引用

  18. 18

    使用带有CMake和Conan的外部库的未定义参考

  19. 19

    未定义对功能CMake的引用

  20. 20

    MinGW / CMake对ZLib的未定义引用

  21. 21

    CMake 对类的未定义引用

  22. 22

    使用cblas库时出现“对'cblas_ddot'的未定义引用”

  23. 23

    与使用名称空间的外部库链接时,如何解决C中的未定义引用?

  24. 24

    使用makefile与带有OTL的静态库链接时未定义的引用

  25. 25

    使用带有外部 C++ 库的 Rcpp 构建 R 包时未定义的引用

  26. 26

    在Linux上使用`libc ++`进行编译时,对`__cxa_thread_atexit @@ CXXABI`的未定义引用

  27. 27

    使用类进行链接时发生简单的C ++未定义引用错误

  28. 28

    对共享库main的未定义引用

  29. 29

    C ++在ubuntu下用cmake链接boost库:对`boost :: iostreams :: zlib :: okay'的未定义引用

热门标签

归档