簡體   English   中英

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 (所以符號是外部的並在文本部分定義),當我運行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;
}

功能文件

#ifndef FUNCCPP_H
#define FUNCCPP_H

void FuncCPP();

#endif

功能文件

#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

功能文件

#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)

有關其他信息,請參閱此討論。

make cmake c link command as c++ commmand 將解決問題

SET(CMAKE_C_LINK_EXECUTABLE ${CMAKE_CXX_LINK_EXECUTABLE})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM