【问题标题】:cmake - undefined reference tocmake - 未定义的引用
【发布时间】:2020-10-29 22:31:22
【问题描述】:

我是cmake 的新手,并且知道这个问题以前曾被问过,但仍然找不到我做错了什么。我有一个带有文件夹/include 和lib 的外部库。 /include 文件夹包含所有标头 (.h),/lib 文件夹包含所有源文件 (.c)。

在我的项目中,我有这个CMakeList.txt 文件:

cmake_minimum_required(VERSION 3.7)
project(FirstAttempt)

set(CMAKE_CXX_STANDARD 11)

set (EXTRA_LIBS "D:\\libtrading")

include_directories(${EXTRA_LIBS}/include)
link_directories(${EXTRA_LIBS}/include)

set(SOURCE_FILES main.cpp)
add_executable(FirstAttempt ${SOURCE_FILES})

target_link_libraries (FirstAttempt  ${EXTRA_LIBS}/lib)

我知道我必须使用target_link_libraries 将库的源文件链接到我的项目,但肯定缺少一些东西,但是什么?我仍然收到错误undefined reference to xxxxxx。

我试图在我的项目中包含的库是https://github.com/libtrading/libtrading。

【问题讨论】:

    标签: c++ c cmake


    【解决方案1】:

    嗯,我试试。

    首先,您似乎在包含头文件的文件夹上调用link_directories(),而it should be used in order to specify the path where to search libraries for。

    第二,共享/静态库文件的target_link_libraries()takes the absolute path 作为第二个参数,同时传递目录路径(嗯,看起来是这样)。

    target_link_libraries() 不链接到“库的源文件”,它链接到已编译的共享/静态库 blob。

    而且,我还建议您将可执行文件的名称保存到变量中,这样您就不会输错目标名称,如下所示:

    set(TARGET FirstAttempt)
    add_executable(${TARGET})
    

    【讨论】:

      【解决方案2】:

      如您所知,我们需要编译所有源文件。所以我们需要指出 Cmake 知道哪里/什么是源文件。

      我认为你应该像这样添加所有源文件

      file(GLOB SOURCES_FILES "lib/*.c" main.cpp)
      

      添加所有 .c 文件。

      或者,您可以单独添加所有 lib/*.c 文件

      file(SOURCES_FILES_LIBS "lib/*.c")
      set(SOURCES_FILES main.cpp)
      add_executable(FirstAttempt ${SOURCES_FILES_LIBS} ${SOURCES_FILES})
      

      【讨论】:

      • file 命令是使用相对目录还是绝对目录?
      • 似乎我需要将库添加为主项目的子目录。这是唯一的方法吗?
      猜你喜欢
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多