【问题标题】:Problems when linking C library to C++ code with CMake使用 CMake 将 C 库链接到 C++ 代码时的问题
【发布时间】:2020-12-15 12:36:58
【问题描述】:

我有一个简单的 C 库,其中包含以下文件: /testlib/library.h /testlib/library.lib

library.h 包含:

#ifdef __cplusplus
extern "C" {
#endif

void function(int a, int b);

#ifdef __cplusplus
}
#endif

我正在尝试在我的 main.cpp 中使用此标头:

extern "C" {
#include "library.h"
}

int main()
{
    function(1, 2);

    return 0;
}

这是我的 CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(StudyProject)

include_directories(testlib/)
link_directories(testlib/)

add_executable(${PROJECT_NAME} "main.cpp")

target_link_libraries(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/testlib/)

我使用 Qt Creator(Windows 平台,MinGW 7.3.0),它使用以下命令构建项目:

cmake.exe --build . --target all

但我在链接时遇到以下错误:

undefined reference to 'function'

谁能帮助我我做错了什么?

【问题讨论】:

  • library.cpp的内容是什么?链接器错误表明您没有在库中实现该函数或没有链接到它。
  • @Zaiborg,我无权访问库源代码。但我保证它具有所有功能实现,因为 Microsoft Visual C++ 2008 在我添加此库时成功编译项目
  • 为什么在#include "library.h" 周围有extern "C" { }?您已经拥有extern "C" { } in library.h.
  • 您可以通过dumpbin 查看library.lib 提供的内容。 SO: How to See the Contents of Windows library (*.lib)
  • 您不需要指定链接到的库的名称,例如target_link_directories(${PROJECT_NAME} library)(其中library 是库文件的基本名称)?

标签: c++ c cmake


【解决方案1】:

你的 cmake 文件没有说你想将你的主程序与给定的库链接,所以链接器正确地抱怨 function() 丢失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2011-03-22
    • 1970-01-01
    • 2022-11-07
    相关资源
    最近更新 更多