用 g++ .cpp 文件编译 gcc .o 文件
Compiling gcc .o files with g++ .cpp files
我有两个文件,print_permu.c
和 gen_permu.cpp
。我希望将 print_permu.c
文件编译成目标文件,然后使用目标文件编译 gen_permu.cpp
,其中包含对 print_permu.c
.
中函数的调用
print_permu.c
#include<stdlib.h>
#include<stdio.h>
typedef char byte;
char *printable=NULL;
size_t pos,size,*char_cnt;
void __print_permu_recurse()
{
if( pos==size )
{
printf("%s\n",printable);
return;
}
byte iter = 25;
while( iter>=0 )
{
if( char_cnt[iter] )
{
printable[pos] = 'a'+iter;
--char_cnt[iter];
++pos;
__print_permu_recurse();
--pos;
++char_cnt[iter];
}
--iter;
}
}
void print_permu(size_t *char_count)
{
char_cnt = char_count;
for(pos = 0,size = 0 ; pos<26 ; ++pos)
size += char_count[pos];
printable = (char*)malloc(sizeof(char)*(size+1));
printable[size] = '[=10=]';
pos = 0;
__print_permu_recurse();
free(printable);
}
gen_permu.cpp
#include<iostream>
#include<string>
extern "C"
{
#include"print_permu.c"
}
using namespace std;
int main()
{
string str;
size_t char_count[26]={},N,iter;
cout << "string:"; cin >> str;
N = str.size();
for(iter=0;iter<N;++iter)
{
++char_count[str[iter]-'a'];
}
print_permu(char_count);
return 0;
}
我尝试了以下命令以上述方式编译代码。
$ gcc -c print_permu.c
$ g++ print_permu.o gen_permu.cpp
/tmp/ccQxAEea.o:(.bss+0x0): multiple definition of `printable'
print_permu.o:(.bss+0x0): first defined here
/tmp/ccQxAEea.o: In function `__print_permu_recurse':
gen_permu.cpp:(.text+0x0): multiple definition of `__print_permu_recurse'
print_permu.o:print_permu.c:(.text+0x0): first defined here
/tmp/ccQxAEea.o: In function `print_permu':
gen_permu.cpp:(.text+0xe0): multiple definition of `print_permu'
print_permu.o:print_permu.c:(.text+0xe9): first defined here
collect2: error: ld returned 1 exit status
$ g++ -c print_permu.c
$ g++ print_permu.o gen_permu.cpp
/tmp/ccPJA0kU.o:(.bss+0x0): multiple definition of `printable'
print_permu.o:(.bss+0x0): first defined here
/tmp/ccPJA0kU.o:(.bss+0x8): multiple definition of `pos'
print_permu.o:(.bss+0x8): first defined here
/tmp/ccPJA0kU.o:(.bss+0x10): multiple definition of `size'
print_permu.o:(.bss+0x10): first defined here
/tmp/ccPJA0kU.o:(.bss+0x18): multiple definition of `char_cnt'
print_permu.o:(.bss+0x18): first defined here
collect2: error: ld returned 1 exit status
首先,我使用gcc
编译代码,希望目标文件在使用g++
编译时能够兼容。那没有用。因此,我尝试单独使用 g++
编译这两个文件,但无济于事。
如何编译这段代码? '我是否缺少任何选项?
使用 gcc 版本 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04), Ubuntu 14.04, x86_64
此外,
我最初想在 print_permu
中声明 __print_permu_recurse
函数,这在 gcc 中是允许的(尽管 C 标准不允许)。我遵循了类似的过程。由于那没有解决,'更改代码以与 C++ 兼容。
你的问题是 gen_permu.cpp
中的这个结构:
extern "C"
{
#include"print_permu.c"
}
您有一个源文件 print_permu.c
和一个源文件 gen_permu.cpp
,其中 包括 print_permu.c
.
当您将 print_permu.c
编译为 object 代码时,它包含源文件 print_permu.c
.
中的所有内容
当您将 gen_permu.cpp
编译为 object 代码时,它包含源文件 gen_permu.cpp
和源文件 print_permu.c
中的所有内容.
当您尝试 link 将它们两个放在一起时,您会得到 "multiple definition" 错误,因为 print_permu.c
中的所有内容都是 也 定义的在 gen_permu.cpp
中,link 用户在决定使用哪个定义时犹豫不决。
您可能打算做的是包含来自print_permu.c
的声明。这不是通过包含整个源文件来完成的,而是通过编写 header 文件 print_permu.h
:
// This is a "header guard". It avoids problems if the
// header is included more than once in a translation unit.
// The token used (here: PRINT_PERMU_H) is up to you, but
// should be sufficiently unique. All uppercase is a common
// convention.
#ifndef PRINT_PERMU_H
#define PRINT_PERMU_H
// This makes a C++ compiler aware that function declarations
// refer to *C* code, not C++ code. (The two languages generate
// different linker symbols.) A C compiler will just ignore this
// (as it should, since it does not need any special handling).
#ifdef __cplusplus
extern "C" {
#endif
// This just *declares* the *existence* of the function.
// The compiler can use this information (in gen_permu.cpp)
// to create a call-to-placeholder. The linker will then
// turn that into a call-to-function when you link the two
// object files together.
void print_permu(size_t *char_count);
// End of the C++ compatibility construct.
#ifdef __cplusplus
}
#endif
// End of the header guard.
#endif
然后,代替顶部的构造,只写
#include "print_permu.h"
在您的 C++ 文件(或 C 文件,由于 #ifdef __cplusplus
而无所谓)。
您的源还有其他各种问题,这些问题不会立即导致失败,但如果它们成为编码习惯,就会带来问题:
无评论,并且假定为 ASCII。
我很确定你的代码对字符做了一些可疑的事情,假设是 ASCII-7 字符集,如果 1) 文本包含 öéß 等国际字符,或者 2) 有问题的系统有 non-consecutive 字符编码(例如 EBCDIC)。
但我对弄清楚您的代码的实际用途感到厌烦,因为其中的评论为零。 (想象一下,我已经发布了 header 示例但没有评论...)所以我不能给你提示如何改进,只是你应该。
我还看到了一个没有大括号的 for
循环 ({}
)。 ;-)
我有两个文件,print_permu.c
和 gen_permu.cpp
。我希望将 print_permu.c
文件编译成目标文件,然后使用目标文件编译 gen_permu.cpp
,其中包含对 print_permu.c
.
print_permu.c
#include<stdlib.h>
#include<stdio.h>
typedef char byte;
char *printable=NULL;
size_t pos,size,*char_cnt;
void __print_permu_recurse()
{
if( pos==size )
{
printf("%s\n",printable);
return;
}
byte iter = 25;
while( iter>=0 )
{
if( char_cnt[iter] )
{
printable[pos] = 'a'+iter;
--char_cnt[iter];
++pos;
__print_permu_recurse();
--pos;
++char_cnt[iter];
}
--iter;
}
}
void print_permu(size_t *char_count)
{
char_cnt = char_count;
for(pos = 0,size = 0 ; pos<26 ; ++pos)
size += char_count[pos];
printable = (char*)malloc(sizeof(char)*(size+1));
printable[size] = '[=10=]';
pos = 0;
__print_permu_recurse();
free(printable);
}
gen_permu.cpp
#include<iostream>
#include<string>
extern "C"
{
#include"print_permu.c"
}
using namespace std;
int main()
{
string str;
size_t char_count[26]={},N,iter;
cout << "string:"; cin >> str;
N = str.size();
for(iter=0;iter<N;++iter)
{
++char_count[str[iter]-'a'];
}
print_permu(char_count);
return 0;
}
我尝试了以下命令以上述方式编译代码。
$ gcc -c print_permu.c
$ g++ print_permu.o gen_permu.cpp
/tmp/ccQxAEea.o:(.bss+0x0): multiple definition of `printable'
print_permu.o:(.bss+0x0): first defined here
/tmp/ccQxAEea.o: In function `__print_permu_recurse':
gen_permu.cpp:(.text+0x0): multiple definition of `__print_permu_recurse'
print_permu.o:print_permu.c:(.text+0x0): first defined here
/tmp/ccQxAEea.o: In function `print_permu':
gen_permu.cpp:(.text+0xe0): multiple definition of `print_permu'
print_permu.o:print_permu.c:(.text+0xe9): first defined here
collect2: error: ld returned 1 exit status
$ g++ -c print_permu.c
$ g++ print_permu.o gen_permu.cpp
/tmp/ccPJA0kU.o:(.bss+0x0): multiple definition of `printable'
print_permu.o:(.bss+0x0): first defined here
/tmp/ccPJA0kU.o:(.bss+0x8): multiple definition of `pos'
print_permu.o:(.bss+0x8): first defined here
/tmp/ccPJA0kU.o:(.bss+0x10): multiple definition of `size'
print_permu.o:(.bss+0x10): first defined here
/tmp/ccPJA0kU.o:(.bss+0x18): multiple definition of `char_cnt'
print_permu.o:(.bss+0x18): first defined here
collect2: error: ld returned 1 exit status
首先,我使用gcc
编译代码,希望目标文件在使用g++
编译时能够兼容。那没有用。因此,我尝试单独使用 g++
编译这两个文件,但无济于事。
如何编译这段代码? '我是否缺少任何选项?
使用 gcc 版本 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04), Ubuntu 14.04, x86_64
此外,
我最初想在 print_permu
中声明 __print_permu_recurse
函数,这在 gcc 中是允许的(尽管 C 标准不允许)。我遵循了类似的过程。由于那没有解决,'更改代码以与 C++ 兼容。
你的问题是 gen_permu.cpp
中的这个结构:
extern "C"
{
#include"print_permu.c"
}
您有一个源文件 print_permu.c
和一个源文件 gen_permu.cpp
,其中 包括 print_permu.c
.
当您将 print_permu.c
编译为 object 代码时,它包含源文件 print_permu.c
.
当您将 gen_permu.cpp
编译为 object 代码时,它包含源文件 gen_permu.cpp
和源文件 print_permu.c
中的所有内容.
当您尝试 link 将它们两个放在一起时,您会得到 "multiple definition" 错误,因为 print_permu.c
中的所有内容都是 也 定义的在 gen_permu.cpp
中,link 用户在决定使用哪个定义时犹豫不决。
您可能打算做的是包含来自print_permu.c
的声明。这不是通过包含整个源文件来完成的,而是通过编写 header 文件 print_permu.h
:
// This is a "header guard". It avoids problems if the
// header is included more than once in a translation unit.
// The token used (here: PRINT_PERMU_H) is up to you, but
// should be sufficiently unique. All uppercase is a common
// convention.
#ifndef PRINT_PERMU_H
#define PRINT_PERMU_H
// This makes a C++ compiler aware that function declarations
// refer to *C* code, not C++ code. (The two languages generate
// different linker symbols.) A C compiler will just ignore this
// (as it should, since it does not need any special handling).
#ifdef __cplusplus
extern "C" {
#endif
// This just *declares* the *existence* of the function.
// The compiler can use this information (in gen_permu.cpp)
// to create a call-to-placeholder. The linker will then
// turn that into a call-to-function when you link the two
// object files together.
void print_permu(size_t *char_count);
// End of the C++ compatibility construct.
#ifdef __cplusplus
}
#endif
// End of the header guard.
#endif
然后,代替顶部的构造,只写
#include "print_permu.h"
在您的 C++ 文件(或 C 文件,由于 #ifdef __cplusplus
而无所谓)。
您的源还有其他各种问题,这些问题不会立即导致失败,但如果它们成为编码习惯,就会带来问题:
无评论,并且假定为 ASCII。
我很确定你的代码对字符做了一些可疑的事情,假设是 ASCII-7 字符集,如果 1) 文本包含 öéß 等国际字符,或者 2) 有问题的系统有 non-consecutive 字符编码(例如 EBCDIC)。
但我对弄清楚您的代码的实际用途感到厌烦,因为其中的评论为零。 (想象一下,我已经发布了 header 示例但没有评论...)所以我不能给你提示如何改进,只是你应该。
我还看到了一个没有大括号的 for
循环 ({}
)。 ;-)