在C+中编译C文件+;Makefile.am中的库

在C+中编译C文件+;Makefile.am中的库,makefile,autotools,automake,Makefile,Autotools,Automake,我正在Github上分叉一个现有项目,我想对其进行一些更改。我想做的一件事是添加一个额外的文件。此文件应位于Makefile.am生成的库之一中。问题是我要添加的文件是一个.c文件,而项目中的所有其他文件都是.cpp 应包含该文件的库在makefile中的使用方式如下: MYLIBRARY=path/mylibrary.a ... path_mylibrary_a_CPPFLAGS = $(AM_CPPFLAGS) path_mylibrary_a_CXXFLAGS = $(AM_CXXFL

我正在Github上分叉一个现有项目,我想对其进行一些更改。我想做的一件事是添加一个额外的文件。此文件应位于Makefile.am生成的库之一中。问题是我要添加的文件是一个.c文件,而项目中的所有其他文件都是.cpp

应包含该文件的库在makefile中的使用方式如下:

MYLIBRARY=path/mylibrary.a

...

path_mylibrary_a_CPPFLAGS = $(AM_CPPFLAGS)
path_mylibrary_a_CXXFLAGS = $(AM_CXXFLAGS)
path_mylibrary_a_SOURCES = \
  path/cppfile1.cpp \
  path/cppfile1.h \
  path/cppfile2.cpp \
  path/cppfile2.h \
  path/cppfile3.cpp \
  path/cppfile3.h

...

mybinary_LDADD = $(MYLIBRARY)
只需将
path/cfile.c
path/cfile.h
添加到源列表中,就会出现以下错误:

CXXLD    mybinary
/usr/bin/ld: path/mylibrary.a(path_mylibrary_a-cfile.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
path/mylibrary.a: error adding symbols: Bad value

我能做什么,MaFiFiel.AM会编译一个C文件,它是用C++构建的项目?< /p> < p>规范的解决这个问题的方法是有一个方便的库,在其中编译C代码:

path_mylibrary_a_LDADD = cfile.la

noinst_LTLIBRARIES = cfile.la
cfile_la_CPPFLAGS = -std=c11
cfile_la_SOURCES = cfile.c

有关更多信息,请参阅此项。

解决此问题的标准方法是使用一个方便的库来编译c代码:

path_mylibrary_a_LDADD = cfile.la

noinst_LTLIBRARIES = cfile.la
cfile_la_CPPFLAGS = -std=c11
cfile_la_SOURCES = cfile.c

有关更多信息,请参阅此。

我假定您的
cfile.h
具有以下结构

#ifndef MYLIBRARY_CFILE_H
#define MYLIBRARY_CFILE_H

#ifdef __cplusplus
extern "C" {
#endif

/* your C declarations here */

#ifdef __cplusplus
}
#endif

#endif /* MYLIBRARY_CFILE_H */
另外,作为一般提示:如果您想在
Makefile.am
文件中向库或程序添加一些源文件,只需添加行即可

path_mylibrary_a_SOURCES += cfile.c cfile.h
这使得一个非常干净的补丁,只增加了一条线,不接触其他线,等等


此外,我同意您可能还需要添加的
路径\u mylibrary\u a\u CFLAGS

我认为您的
文件.h
具有此结构

#ifndef MYLIBRARY_CFILE_H
#define MYLIBRARY_CFILE_H

#ifdef __cplusplus
extern "C" {
#endif

/* your C declarations here */

#ifdef __cplusplus
}
#endif

#endif /* MYLIBRARY_CFILE_H */
另外,作为一般提示:如果您想在
Makefile.am
文件中向库或程序添加一些源文件,只需添加行即可

path_mylibrary_a_SOURCES += cfile.c cfile.h
这使得一个非常干净的补丁,只增加了一条线,不接触其他线,等等


另外,我同意您可能还需要添加的
path\u mylibrary\u a\u CFLAGS

也许您应该添加
path\u mylibrary\u CFLAGS
变量?当然是适当初始化的。也许您应该添加一个
path\u mylibrary\u CFLAGS
变量?当然是适当的初始化。我尝试过很多不同的方法,但是它产生了一个不同的问题。在引用.c文件的.cpp文件中,我得到一个错误,表示引用未定义,这与在makefile中根本不包含.c文件是一样的。引用未定义是链接器问题。您可能希望使用objdump检查是否定义了符号。如果不使用extern“c”blockTry,则在.cpp文件中包含.c文件将不起作用。仅在cpp文件中包含头文件我只包含头文件。我尝试了许多不同的方法,但它会产生不同的问题。在引用.c文件的.cpp文件中,我得到一个错误,表示引用未定义,这与在makefile中根本不包含.c文件是一样的。引用未定义是链接器问题。如果定义了符号,您可能需要使用ObjDoP。如果使用Extn“C”块,仅包含CPP文件中的头文件,只包含头文件,那么,在.CPP文件中也将不工作。除非源代码文件使用C编译器,而不是C++编译器。C和C++是不同语言。对用C编写的源文件使用C编译器是正确的做法。C++编译器和链接器然后使用C链接链接到C编译器创建的对象文件,C++程序可以从C源访问对象。编译器人员告诉我们使用相同的编译器和标志来编译项目中的源文件。对于C++项目,这意味着使用C++编译器来处理C源文件。它确保C源文件满足他们所需的选项,如<代码> -FRTI 和 FExcExps<代码>。“编译器的人告诉我们”在哪里使用C++编译器编译C代码?(使用代码< > g++<代码>链接C++和C生成的对象文件,分别与 GCC >不同,编译时,仍然使用C编译器,而不是C++编译器,源文件是C语言和C++语言。对用C编写的源文件使用C编译器是正确的做法。C++编译器和链接器然后使用C链接链接到C编译器创建的对象文件,C++程序可以从C源访问对象。编译器人员告诉我们使用相同的编译器和标志来编译项目中的源文件。对于C++项目,这意味着使用C++编译器来处理C源文件。它确保C源文件满足他们所需的选项,如<代码> -FRTI 和 FExcExps<代码>。“编译器的人告诉我们”在哪里使用C++编译器编译C代码?(使用代码< > g++<代码>链接C++和C生成的对象文件,分别与<代码> G++<代码>和<代码> GCC >不同于编译。