CMake 不链接 C 和 C++ 静态库(未定义对函数的引用)
CMake doesn't link C and C++ static libraries (undefined reference to function)
我试图重现最小的问题。当我在Ubuntu上运行CMake+Make时,我得到错误
funccpp.cpp:(.text+0x5): undefined reference to `FuncC'
即在C++库中导入时找不到C库中导出的函数。当我尝试使用g++ main.cpp funcc.c funccpp.cpp
手动编译时,它成功地编译了最终程序。如何解决CMake问题?
作为参考,当我运行nm libfuncc_lib.a
时,我会得到行T FuncC
(因此符号是外部的,在Text部分中定义(,当我执行nm libfunccpp_lib.a
时,我得到U FuncC
(因此符号未定义,应该从外部链接(。
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(Test C CXX)
set (SRC_CPP funccpp.cpp)
set (SRC_C funcc.c)
set (SRC_MAIN main.cpp)
add_library(funcc_lib STATIC ${SRC_C})
add_library(funccpp_lib STATIC ${SRC_CPP})
add_executable(prog ${SRC_MAIN})
target_link_libraries(prog funcc_lib funccpp_lib)
main.cpp
#include "funccpp.h"
int main() {
FuncCPP();
return 0;
}
funccpp.h
#ifndef FUNCCPP_H
#define FUNCCPP_H
void FuncCPP();
#endif
funccpp.cpp
#include "funcc.h"
void FuncCPP() {
FuncC();
}
函数h
#ifndef FUNCC_H
#define FUNCC_H
#ifdef __cplusplus
extern "C" {
#endif
void FuncC();
#ifdef __cplusplus
}
#endif
#endif // FUNCC_H
函数c
#include "funcc.h"
#include <stdio.h>
void FuncC() {
printf("Hello, World!n");
}
这里的问题是,链接器依赖于库的顺序。带
target_link_libraries(prog funcc_lib funccpp_lib)
它首先链接funcc_lib
,然后链接funccpp_lib
。但它永远不会回到funcc_lib
。由于funccpp_lib
依赖于funcc_lib
,因此必须更改库的顺序:
target_link_libraries(prog funccpp_lib funcc_lib)
有关其他信息,请参阅本讨论。
将cmake c link命令作为c++命令将解决问题
SET(CMAKE_C_LINK_EXECUTABLE ${CMAKE_CXX_LINK_EXECUTABLE})
相关文章:
- 从python调用openMP共享库时,未定义opnMP函数
- 具有外部"c"和程序集的未定义函数
- 已定义函数时出现 G++ "未定义的引用"错误
- 对显式实例化的模板函数的未定义引用
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 为什么我会收到警告,指出函数已使用但未定义,以及已定义但未使用?
- 2个模板化类的非模板友元函数未定义引用错误
- 使用内联函数 c++ 的未定义引用
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- 仅在 MacOS 上析构函数的未定义符号
- 如果用户尝试从 JS 调用对象的未定义函数C++则回调C++代码
- C++编译并链接到指向未定义函数的指针
- C++:定义函数时出现未定义函数错误
- 奇怪的未定义函数引用,函数调用C++不存在
- 类型为"double"的输入参数的未定义函数
- Android NDK:创建一个未定义函数的库
- c++ Builder调用未定义函数hypot/ceil/floor/fab
- 通过 GDB 设置断点时未定义函数"d::~d"
- 如何像传递未定义函数一样传递未定义方法
- 确定未定义函数的参数类型