簡體   English   中英

如何將C ++靜態庫鏈接到C程序?

[英]How do you link a C++ static library to a C program?

我有以下c ++程序:

Client.h

#ifndef Client_Client_h
#define Client_Client_h

#include "Client.h"

class Client {

public:
    void f1();
    void f2();
};

#endif

Client.cpp

#include <iostream>
#include <stdlib.h>
using namespace std;

#include "Client.h"

void Client::f1(){
    cout << "Client.f1()" << endl;
}

void Client::f2() {
    cout << "Client.f2()" << endl;
}

在XCode 4.3中編譯上面給我一個靜態庫文件,名為:

libClient.a

另外,我有一個main.c

#include <stdio.h>
//
//using namespace std;

int main(){
        // how do I do something like: Client c; c.f1(); c.f2(); 
        // and actually get output ? 
        printf("hello\n");
        return 0;
}

為了調用f1()和f2(),我需要采取什么步驟? 如何使用GCC正確鏈接靜態庫?

到目前為止,我嘗試過:

gcc -lClient.a main.c 

這給了我:

ld: library not found for -lClient.a
collect2: ld returned 1 exit status

這不會起作用,或者至少不會是便攜式的。 一個非常明顯的事情是使您的程序C ++,以便您可以訪問這些功能。

出於顯而易見的原因,您不能“本地”使用C代碼中的C ++代碼。 您無法訪問面向對象的功能,因此大量的東西不會起作用:構造函數,析構函數,移動/復制語義和虛擬繼承可能是您將錯過的最重要的事情。 (這是正確的:你將無法正確創建或銷毀對象,除非它們具有瑣碎的構造函數和析構函數。)

您還將遇到鏈接問題:C ++函數名稱被破壞成一個混亂,包括它們的參數類型和返回類型和類,它們看起來像__1cGstrcpy6Fpcpkc_0_ 在C中聲明函數的受損名稱以使用它們在技術上是可行的 ,或者使用dlsym來獲取指向它們的指針,但這很簡單。 不要那樣做。

如果你需要創建C ++中的函數 ,需要從C來調用,您可以指定它extern "C" ,它的名字也不會錯位,這將是自C訪問,這將是自己能夠使用C ++功能:

extern "C" void Foo()
{
    std::string hello = "Hello world!";
    std::cout << hello << std::endl;
}

然后,您需要在程序的C端聲明它,如下所示:

void Foo();

你可以打電話給它。

您可以將所有要在C語言中暴露的C ++調用包裝在extern "C"函數中,並返回指向您的類型的指針並以這種方式處理它,但它會很快變得煩人。 你真的應該只使用C ++。

就與靜態庫的鏈接而言,在Xcode中,轉到項目設置,選擇目標,轉到Build Phases選項卡,展開“Link Binary With Libraries”部分,然后將.a文件放在那里。

暫無
暫無

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

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