当我使用 iostream (Linux, CodeBlocks) 时,C++ 无法编译
C++ can't compile when I use iostream (Linux, 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<br>
/usr/bin/ld: obj/Debug/main.o: Die Umlagerung von
obj/Debug/main.o: 添加符号时出错:Ungültiger Wert
collect2:错误:ld 返回 1 退出状态
进程终止,状态为 1(0 分钟,0 秒)
1 个错误,0 个警告(0 分钟,0 秒)
构建消息:
||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 因此,如果您需要更多信息,请帮助我找到这些信息。
我不使用代码块,所以我不知道它是如何决定省略 fPIC 标志的。如果您尝试使用
在命令行上构建它
g++ main.cpp -o main.o
gcc(在我的例子中是v5.4)提示你添加-fPIC标志,错误消失,编译成功。 fPIC 代表位置无关代码。即,函数地址(跳转地址)不是硬编码的,而是留空的。加载程序在需要 .so 时将其加载到内存中,然后动态填充跳转地址。 (-fpic 也可以工作,它用于短跳转,而 fPIC 也适用于长跳转,即以二进制大小为代价的更大的跳转范围。)
我想在 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<br>
/usr/bin/ld: obj/Debug/main.o: Die Umlagerung von
obj/Debug/main.o: 添加符号时出错:Ungültiger Wert
collect2:错误:ld 返回 1 退出状态
进程终止,状态为 1(0 分钟,0 秒)
1 个错误,0 个警告(0 分钟,0 秒)
构建消息:
||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 因此,如果您需要更多信息,请帮助我找到这些信息。
我不使用代码块,所以我不知道它是如何决定省略 fPIC 标志的。如果您尝试使用
在命令行上构建它g++ main.cpp -o main.o
gcc(在我的例子中是v5.4)提示你添加-fPIC标志,错误消失,编译成功。 fPIC 代表位置无关代码。即,函数地址(跳转地址)不是硬编码的,而是留空的。加载程序在需要 .so 时将其加载到内存中,然后动态填充跳转地址。 (-fpic 也可以工作,它用于短跳转,而 fPIC 也适用于长跳转,即以二进制大小为代价的更大的跳转范围。)