Tag: makefile

将旧的makefile转换为CMake

我正在尝试将旧的makefile代码转换为CMake。 你能帮助我吗? 这是我目前陷入困境的部分。 我不知道如何将这些参数传递给编译器。 COMPILE_FLAGS = -c -m32 -O3 -fPIC -w -DSOMETHING -Wall -I src/sdk/core ifdef STATIC OUTFILE = “bin/test_static.so” COMPILE_FLAGS_2 = ./lib/ABC.a else OUTFILE = “bin/test.so” COMPILE_FLAGS_2 = -L/usr/lib/mysql -lABC endif all: g++ $(COMPILE_FLAGS) src/sdk/*.cpp g++ $(COMPILE_FLAGS) src/*.cpp g++ -fshort-wchar -shared -o $(OUTFILE) *.o $(COMPILE_FLAGS_2) rm -f *.o 谢谢!

在子目录中构建共享库

我正在尝试构建一个使用一些C代码的R包。 我有一个C库,它被编译成可执行文件,可以从命令行调用。 有一个与之关联的Makefile。 我试图在这里查看信息 如果要创建然后链接到库,比如使用子目录中的代码,请使用类似的东西 .PHONY: all mylibs all: $(SHLIB) $(SHLIB): mylibs mylibs: (cd subdir; make) 小心创建所有必需的依赖项,因为无法保证所有依赖项都以特定顺序运行(并且某些CRAN构建机器使用多个CPU和并行产生)。 如果我在我的包中创建一个src文件夹的新子目录,名为someLibrary ,代码和Makefile保持不变,反过来,在我的包的原始Makevars文件中,我将上面的代码保持不变,那么我将能够构建要使用useDynLib导出的共享库? 编辑1: 在这里的信息,我更改了Makefile以通过添加创建共享库 CFLAG = -fPIC -g -O3 LDFLAGS= -shared 但是,这会导致.so文件不直接导出到包的libs目录的问题。 如果我硬编码到目标的路径,那么文件将被发送到包的libs目录(这是通过调用R CMD INSTALL myPackage )。 编辑2: 最后,我想知道如何调用共享库,因为它有一个main()方法,我可以从命令行可执行文件中调用它。 将它暴露给R NAMESPACE的过程是什么,以便可以通过.Call调用.Call ? PS。 如果我将最后一点作为一个单独的问题,请告诉我。

automake和项目依赖

我有一个项目,我想用automake构建。 该项目由不同的组件或模块组成,并且存在模块间依赖性,这需要以特定顺序构建项目。 例如: project dir/ module1 (core C shared lib) module2 (C++ shared lib wrapper around module 1) module3 (C++ application with dependency on module2) module4 (C library with dependency on module1) module5 (C application with dependency on module4) 我对automake来说相对较新,但我(几乎)知道如何使用它来成功构建一个项目。 我想有一个’主’项目文件(如果可能的话),它指定项目模块的构建顺序,运行unit testing,如果有的话,整个构建过程都失败: 其中一个模块无法构建 其中一个模块未通过unit testing 我将如何编写这样一个“主项目”文件(或调用任何其他机制)来构建具有大量模块间依赖关系的项目?

makefile出错(“无输入文件”)

这是我第一次制作makefile,我真的很想了解这个过程。 我正在尝试为C ++项目创建一个非常简单的makefile,其结构如下: 根文件夹 生成文件 自述 src文件夹 ……这里的源文件…… 包含文件夹 …这里有外部库的头文件… lib文件夹 …这里的外部lib文件… bin文件夹 …构建可执行文件的输出目录… obj文件夹 …这里的目标文件…… 我在这里按照教程。 这是我的makefile: IDIR=include . CC=g++ CFLAGS=-I$(IDIR) ODIR=bin/obj LDIR=lib LIBS=none SRC=src _DEPS=hello.h DEPS=$(patsubst %,$(IDIR)/,%(_DEPS)) _OBJ=file1.o file2.o OBJ=$(patsubst %,$(ODIR)/%,$(_OBJ)) $(ODIR)/%.o: $(SRC)/%.cpp $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) # $(LIBS) test_proj: $(OBJ) $(CC) -o $@ $^ $(CFLAGS) .PHONY: clean clean: rm […]

未定义的引用`log’

我正在尝试编译Donald Eastlake的RFC 3797随机选择算法的实现(代码: http : //kambing.ui.ac.id/minix/other/rfc3797/ )。 但是,我收到链接器错误: rfc3797.c:(.text+0xe7f): undefined reference to `log’ 我试图用提供的Makefile来实现它,它明确地链接到数学图书馆,但我仍然得到错误: cc -lm -o randomselection rfc3797.c MD5.c 我该如何编译这个程序?

如何在编译期间编辑可执行文件而不更改其源代码?

我必须编写一个编译文件year.c的Makefile,然后它会显示当前年份(2014),而不是前一年(2013)。我尝试过使用sed函数,但只有在我使用make时才有效跑 。 #include #ifndef YEAR #define YEAR “2013” #endif int main(){ printf(“Hello world from ” YEAR “\n”); return 0; } 和Makefile: year: year.c gcc year.c -o year run: ./year | sed -e ‘s/3/4/g’ clean: rm year Makefile

如何判断程序是在x86 / x64还是ARM Linux平台上运行

在c程序中,我想做不同的事情。 该程序将在基于x86 / x64的GNU / Linux系统以及基于ARM的系统(例如PC或RaspberryPI)上运行。 GCC中是否有预定义的宏来告诉平台? 就像是 #ifdef _X64_ /do x64 stuff #elif _ARM_ //do arm stuff #endif 或者这可能是错误的做法? 我将使用Makefile进行编译,我可以使用自己的定义。 什么是最好/最安全的方法?

在制作ESP8266项目时获取C函数的未定义引用

我按照本教程将一个Kaa应用程序安装到ESP8266中,经过一些修改后它可以工作: https ://kaaproject.github.io/kaa/docs/v0.10.0/Programming-guide/Using-Kaa-endpoint-SDKs / C / SDK-ESP8266 / 我必须做的一个修改是在eagle.app.v6.ld中移动一行代码,因为字节溢出(箭头指向要改变我做的): … .irom0.text : ALIGN(4) { _irom0_text_start = ABSOLUTE(.); *(.literal.* .text.*) –> moved from “.text : ALIGN(4){…}” … } … 在我这样做后,我仍然有一些字节溢出,所以我修改了文档中的原始cmake命令,以禁用占用空间的cmake扩展: cmake \ -DCMAKE_TOOLCHAIN_FILE=../kaa/toolchains/esp8266.cmake \ -DKAA_PLATFORM=esp8266 \ -DCMAKE_BUILD_TYPE=MinSizeRel \ -DWITH_EXTENSION_CONFIGURATION=OFF \ -DWITH_EXTENSION_EVENT=OFF \ -DWITH_EXTENSION_LOGGING=OFF \ -DWITH_EXTENSION_NOTIFICATION=OFF \ -DWITH_EXTENSION_USER=OFF \ -DWITH_ENCRYPTION=OFF \ -DKAA_MAX_LOG_LEVEL=3 .. 最后,当我运行make命令时。 有效。 然后我创建并将二进制文件闪存到我的ESP中。 然后我重置我的ESP,GPIO0为高(所以它可以从闪存启动),ESP发送“Hello,Kaa!” […]

getline函数的冲突类型

我的代码块中有getline函数的函数。但是在编译make文件时我得到以下错误: cc -DMAIN -c -o terp.o terp.c terp.c:130:15: error: conflicting types for ‘getline’ In file included from terp.c:2:0: /usr/include/stdio.h:675:20: note: previous declaration of ‘getline’ was here make: *** [terp.o] Error 1 部分terp.c大约130: PRIVATE char *getline() { static int first_time_called=1; if(!first_time_called) return 0; first_time_called=0; return Expr; }

Makefile:没有规则来制作目标

我正在寻找这个网站上的解决方案,现在也尝试谷歌一段时间了,但不知怎的,我无法让它工作。 我的源应该在src目录中,目标文件将在obj目录中。 现在我尝试创建一个简单的makefie但我得到一个没有规则的错误,或者我无法使它工作使用目录。 CC = /usr/bin/gcc CXXFLAGS = -O2 -g -Wall -fmessage-length=0 SRC:= nohupshd.cpp \ task.cpp OBJ:= nohupshd.o \ task.o OBJDIR:= obj SRCDIR:= src DEP:= src/task.h LIBS:= TARGET:= nohupshd all: $(TARGET) $(TARGET): $(OBJ) $(CC) -o $(TARGET) $(OBJ) $(LIBS) clean: rm -f $(OBJ) $(TARGET) 变式1: $(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(CC) -S $(SRCDIR)/$< -o $(OBJDIR)/$@ $(CC) -c $(SRCDIR)/$< -o […]