c++ - CMake 不链接 C 和 C++ 静态库(未定义对函数的引用)
问题描述
我试图重现最小的问题。当我在 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
(所以符号是外部的并在文本部分定义),当我运行时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)
主文件
#include "funccpp.h"
int main() {
FuncCPP();
return 0;
}
funcpp.h
#ifndef FUNCCPP_H
#define FUNCCPP_H
void FuncCPP();
#endif
funcpp.cpp
#include "funcc.h"
void FuncCPP() {
FuncC();
}
函数库
#ifndef FUNCC_H
#define FUNCC_H
#ifdef __cplusplus
extern "C" {
#endif
void FuncC();
#ifdef __cplusplus
}
#endif
#endif // FUNCC_H
函数cc
#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)
推荐阅读
- javascript - 如何在我的 webpack 项目中使用 require.context?
- bson - LiteDB BsonExpression:是否有任何方法返回 true?
- c# - 带有尾随“。”的 WPF DependencyProperty 问题。
- python - 为什么使用 python stripe lib 检索时,条带费用不显示为“已退款”?
- java - 如何在 Android 模拟器中手动选择纬度和经度,而不是选择地图上的点,
- sql - 如何在 SQL Server 的 BINARY 或 VARBINARY 变量中设置特定位?
- r - 如何提取向量变量的第一行
- javascript - WordPress 无法识别自定义 JS?
- javascript - 当使用 PHP 插入更多条目时,如何控制 Chart.js 中 Y 轴值的覆盖?
- python - 包含黑色代码格式化程序行长忽略注释