首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我使用iostream (Linux,CodeBlocks)时,CodeBlocks无法编译

当我使用iostream (Linux,CodeBlocks)时,CodeBlocks无法编译
EN

Stack Overflow用户
提问于 2017-06-18 22:33:34
回答 1查看 520关注 0票数 0

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

代码语言:javascript
复制
 #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++和代码::块,因此,如果您需要更多的信息,请帮助我在哪里可以找到这些信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-19 22:21:44

我不使用代码块,所以我不知道它是如何决定省略fPIC标志的。如果您试图在命令行上构建它

代码语言:javascript
复制
g++ main.cpp -o main.o

gcc (在我的例子中是5.4)提示您添加-fPIC标志,错误消失,编译成功。fPIC代表位置独立的代码。也就是说,函数地址(跳转地址)不是硬编码的,而是留空的。当加载程序需要.so时,将其加载到内存中,然后动态地填充跳转地址。(-fpic也可以工作,它适用于短跳,而fPIC也可以容纳长跳,即以二进制大小为代价的更大的跳变范围。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44620167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档