2017-06-18 161 views
0

我想在Java中使用C++代碼。我知道我必須使用JNI。現在我想在Linux上用C++編譯一個共享庫。我使用Code :: Blocks 16.01 IDE和GNU GCC編譯器。 現在我想編譯這個非常簡單的代碼:當我使用iostream時,C++無法編譯(Linux,CodeBlocks)

#include <iostream> 

void sayHello() 
{ 
    std::cout << "Hello from C++" << std::endl; 
} 

(我知道,我也有包括一些在Java以後使用這個庫,但是這只是我的第一次測試,如果它編譯)

生成日誌是:

g++ -shared obj/Debug/main.o -o bin/Debug/libnativetest.so
/usr/bin/ld: obj/Debug/main.o: Die Umlagerung von obj/Debug/main.o: error adding symbols: Ungültiger Wert collect2: error: ld returned 1 exit status Process terminated with status 1 (0 minute(s), 0 second(s)) 1 error(s), 0 warning(s) (0 minute(s), 0 second(s))

構建的消息:

||error: ld returned 1 exit status| ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

當我只編譯方法沒有#include <iostream>(肯定沒有cout)它的作品。 我已經測試了另一個頭文件,如#include <string>,這個工程。 當我創建項目而不是共享庫而不是控制檯應用程序時,我可以使用<iostream>

我是C++和Code :: Blocks的新手,因此如果您需要更多的信息,請幫助我在哪裏可以找到這些信息。

+0

你是如何編譯導致main.o的代碼的?另外,不要使用本地化的構建工具,而是始終使用能夠生成英文錯誤消息的構建工具,這樣就可以通過複製和粘貼輕鬆地搜索錯誤。 –

+0

當我右鍵單擊項目面板中的main.cpp並單擊構建文件時,我認爲main.cpp可以正確構建。但我仍然無法編譯到圖書館。 –

+0

你可以嘗試添加'-fPIC' – Galik

回答

0

我不使用代碼塊,所以我不知道它如何決定省略fPIC標誌。如果你嘗試用

g++ main.cpp -o main.o 

gcc的(在我的情況V5.4)來構建它的命令行提示您添加-fPIC標誌,用錯誤消失,編譯成功。 fPIC代表與位置無關的代碼。即功能地址(跳轉地址)不是硬編碼的,而是留空的。加載器在需要.so時加載到內存中,然後動態填充跳轉地址。 (-fpic也可以工作,這是爲了短暫的跳轉,而fPIC也適用於長跳轉,即以二進制大小爲代價的更大跳轉範圍)。