2017-06-18 133 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也适用于长跳转,即以二进制大小为代价的更大跳转范围)。