如果我包含<stdlib.h>或<stdio.h>在C程序中,我不必在编译时链接这些,但我必须链接到<math.h>,使用-lmgcc,例如:
gcc test.c -o test -lm
Run Code Online (Sandbox Code Playgroud)
这是什么原因?为什么我必须显式链接数学库而不是其他库?
这是一个例子:
#include <iostream>
using namespace std;
int main()
{
cout << "Hola, moondo.\n";
}
Run Code Online (Sandbox Code Playgroud)
它抛出错误:
gcc -c main.cpp gcc -o edit main.o main.o: In function `main':
main.cpp:(.text+0xa): undefined reference to `std::cout'
main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char,std::char_traits<char> >& std::operator<< <std::char_traits<char>>(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
main.o: In function `__static_initialization_and_destruction_0(int,int)':
main.cpp:(.text+0x3d): undefined reference to `std::ios_base::Init::Init()'
main.cpp:(.text+0x4c): undefined reference to `std::ios_base::Init::~Init()' collect2: error: ld
returned 1 exit status make: *** [qs] Error 1
Run Code Online (Sandbox Code Playgroud)
此外,这个例子:
#include <iostream>
int main()
{
std::cout<<"Hola, moondo.\n";
}
Run Code Online (Sandbox Code Playgroud)
抛出错误:
gcc …Run Code Online (Sandbox Code Playgroud) 在汇编代码生成,可用库,语言功能等方面编译C和C++代码时,3个编译器CC,gcc,g ++有什么区别?
问题:如何使用gcc编译器编译C++程序?
info.c:
#include<iostream>
using std::cout;
using std::endl;
int main()
{
#ifdef __cplusplus
cout << "C++ compiler in use and version is " << __cplusplus << endl;
#endif
cout <<"Version is " << __STDC_VERSION__ << endl;
cout << "Hi" << __FILE__ << __LINE__ << endl;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译 info.c
$ gcc info.C
Undefined first referenced
symbol in file
cout /var/tmp/ccPxLN2a.o
endl(ostream &) /var/tmp/ccPxLN2a.o
ostream::operator<<(ostream &(*)(ostream &))/var/tmp/ccPxLN2a.o
ostream::operator<<(int) /var/tmp/ccPxLN2a.o
ostream::operator<<(long) /var/tmp/ccPxLN2a.o
ostream::operator<<(char const *) /var/tmp/ccPxLN2a.o
ld: fatal: Symbol referencing errors. No output written …Run Code Online (Sandbox Code Playgroud) 我刚刚在我的Ubuntu上找到了两个不同的C++编译器:/ usr/bin/g ++和/ usr/bin/c ++.我不熟悉后者,但是man c ++只是跳到了gcc的联机帮助页面.我想知道它们作为C++编译器的区别是什么?
感谢致敬!
所有,我在我的mac os x 10.8中编写了这样的代码,当我使用"gcc use_new.cpp -o use_new"来编译它时,它会抛出错误的消息,如下所示:
Undefined symbols for architecture x86_64:
"std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from:
_main in ccr2vrRQ.o
"std::basic_ostream<char, std::char_traits<char> >::operator<<(void const*)", referenced from:
_main in ccr2vrRQ.o
"std::basic_ostream<char, std::char_traits<char> >::operator<<(double)", referenced from:
_main in ccr2vrRQ.o
"std::basic_ostream<char, std::char_traits<char> >::operator<<(int)", referenced from:
_main in ccr2vrRQ.o
"std::basic_ostream<char, std::char_traits<char> >::operator<<(unsigned long)", referenced from:
_main in ccr2vrRQ.o
"std::ios_base::Init::Init()", referenced from:
__static_initialization_and_destruction_0(int, int) in ccr2vrRQ.o
"std::ios_base::Init::~Init()", referenced from:
__static_initialization_and_destruction_0(int, int) in ccr2vrRQ.o
"std::cout", referenced from:
_main in ccr2vrRQ.o
"std::basic_ostream<char, …Run Code Online (Sandbox Code Playgroud) 我刚检查了C++标准.看来以下代码不应该是未定义的行为:
unsigned int val = 0x0FFFFFFF;
unsigned int res = val >> 34; // res should be 0 by C++ standard,
// but GCC gives warning and res is 67108863
Run Code Online (Sandbox Code Playgroud)
并从标准:
E1 >> E2的值是E1右移E2位位置.如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是E1/2 ^ E2的商的整数部分.如果E1具有有符号类型和负值,则生成的值是实现定义的.
根据标准,由于34不是负数,因此变量res将为0.
GCC为代码段提供以下警告,并且res是67108863:
警告:右移计数> =类型的宽度
我还检查了GCC发出的汇编代码.它只是调用SHRL,而SHRL的英特尔指令文件res不是ZERO.
那么这是否意味着GCC没有在英特尔平台上实现标准行为?
在我看来,gcc可以处理c和c ++项目,那么为什么需要g ++/gcc-c ++呢?
g ++和gcc-c ++有什么区别?
我创建了一个文件hi.cpp,我写了下面给出的命令:
#include <iostream>
using namespace std;
int main ()
{
cout << "Hello World! ";
cout << "I'm a C++ program";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我使用以下命令在我的RHEL 6机器上运行它
gcc hi.cpp
Run Code Online (Sandbox Code Playgroud)
我有一些错误如下:
[chankey@localhost ~]$ gcc hi.cpp
/tmp/cc32bnmR.o: In function `main':
hi.cpp:(.text+0xa): undefined reference to `std::cout'
hi.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, const char*)'
hi.cpp:(.text+0x19): undefined reference to `std::cout'
hi.cpp:(.text+0x1e): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, const char*)'
/tmp/cc32bnmR.o: In function `__static_initialization_and_destruction_0(int, int)': …Run Code Online (Sandbox Code Playgroud) 我正在尝试用gcc和eclipse构建一个开源的c ++库.但我得到此错误'memcpy'未在此范围内声明
我试着包含memory.h(和string.h),如果我点击"打开声明",eclipse会找到该函数,但gcc会给我错误.
我能怎么做?
#include <algorithm>
#include <memory.h>
namespace rosic
{
//etc etc
template <class T>
void circularShift(T *buffer, int length, int numPositions)
{
int na = abs(numPositions);
while( na > length )
na -=length;
T *tmp = new T[na];
if( numPositions < 0 )
{
memcpy( tmp, buffer, na*sizeof(T));
memmove( buffer, &buffer[na], (length-na)*sizeof(T));
memcpy( &buffer[length-na], tmp, na*sizeof(T));
}
else if( numPositions > 0 )
{
memcpy( tmp, &buffer[length-na], na*sizeof(T));
memmove(&buffer[na], buffer, (length-na)*sizeof(T));
memcpy( buffer, tmp, na*sizeof(T));
}
delete[] tmp; …Run Code Online (Sandbox Code Playgroud)