使用iostream时,C ++无法编译(Linux,CodeBlocks)

时间:2017-06-18 22:33:35

标签: c++ codeblocks

我想在Java中使用C ++代码。我知道我必须使用JNI。现在我想在Linux上用C ++编译一个共享库。我使用Code :: Blocks 16.01 IDE和GNU GCC编译器。 现在我想编译这个非常简单的代码:

 #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的新手,因此如果您需要更多信息,请帮助我找到这些信息。

1 个答案:

答案 0 :(得分:0)

我不使用代码块,所以我不知道它是如何决定省略fPIC标志的。如果您尝试使用

在命令行上构建它
g++ main.cpp -o main.o

gcc(在我的情况下是v5.4)会提示你添加-fPIC标志,错误消失并且编译成功。 fPIC代表与位置无关的代码。即,功能地址(跳转地址)不是硬编码的,而是留空的。加载器在需要.so时,将其加载到内存中,然后动态填充跳转地址。 (-fpic也可以工作,它用于短跳,而fPIC也适用于长跳跃,即以二进制大小为代价的更大的跳跃范围。)