相关疑难解决方法(0)

Makefile在多个目录中

我想构建一个应用程序,我有多个模块存储在多个目录中.我决定遵循这个想法,即在每个目录中都有一个makefile然后合并它.但是 - 作为初学者程序员 - 我仍然没有看到如何做到这一点.首先,这种"部分"的makefile是怎样的.它们不能具有main函数,因为每个二进制文件只能有一个,但是当我尝试编译它时,gcc会抱怨对main的未定义引用.其次,我不知道如何将所有这些模块组合在一起.

我将不胜感激,但请尽量保持简单的答案.Makefile对我来说仍然是一个黑魔法.

makefile

8
推荐指数
1
解决办法
1万
查看次数

使用类似规则构建多个可执行文件

我写的东西像C++的互动教程.本教程将由两部分组成:一部分编译成一个库(我使用Scons构建它),另一部分(课程)随最终用户编译的教程一起提供.我正在寻找一种方便人们建立这些课程的好方法.

基本上,第二部分是一个包含所有课程的目录,每个目录都在自己的目录中.每课至少有一个lesson.cppmain.cpp文件,还可以存在其他文件,其中存在的我不知道,直到它被运后-最终用户将创建这些.它看起来像这样:

all_lessons/
    helloworld/
        lesson.cpp
        main.cpp
    even_or_odd/
        lesson.cpp
        main.cpp
    calculator/
        lesson.cpp
        main.cpp
        user_created_add.cpp
Run Code Online (Sandbox Code Playgroud)

这些中的每一个都需要根据几乎相同的规则进行编译,并且编译命令应该可以从其中一个课程目录(helloworld/等等)运行.

看到项目的其余部分是使用Scons构建的,因此将它用于此部分也是有意义的.然而,使用SCons将搜索SConstruct它从运行目录下的文件:这是可以接受的把SConstruct每节课目录中的文件,再加上一个SConscriptall_lessons/给出的一般规则目录?这似乎违背了Scons期望项目组织的典型方式:这种方法的潜在缺陷是什么?我可以放一个SConstruct文件而不是SConscript文件,从而可以从任一目录构建(使用导出来避免无休止的递归,我猜)?

另外,我可能在某一时刻要替换lesson.cpp一个lesson.py生成所需的文件; Scons是否允许我轻松地与构建者一起完成这项工作,或者是否有一个更方便的框架?

最后,我想最终得到以下内容(或具有不同构建系统的等效内容):

all_lessons/
    SConstruct
    helloworld/
        SConstruct
        lesson.cpp
        main.cpp
    even_or_odd/
        SConstruct
        lesson.py
        main.cpp
    calculator/
        SConstruct
        lesson.cpp
        main.cpp
        user_created_add.cpp
Run Code Online (Sandbox Code Playgroud)

scons allall_lessons目录中运行需要:

  • 运行even_or_odd/lesson.py生成even_or_odd/lesson.cpp.
  • 意识到user_created_add.cpp还需要编译.
  • 为每节课制作可执行文件.

运行sconseven_or_odd/,或者scons even_or_oddall_lessons/应该产生一个可执行与上面的一个(相同的编译标志).

摘要:

  1. Scons是否适合/能够做到这一点?
  2. 当 …

c++ build-automation build scons

6
推荐指数
1
解决办法
4454
查看次数

如何将 C 编译输出文件(Linux 内核模块)放在与源文件不同的目录中(使用 Makefile)

我已经查看了这些以及这些其他解决方案,但无法编写正确的 Makefile 来产生我想要的结果。

所以,我有这个simple.c文件。它模拟linux内核模块的加载和删除。地点:/path/to/dir/simple.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

/* This function is called when the module is loaded. */
int simple_init(void)
{
       printk(KERN_INFO "Loading Module\n");

       return 0;
}

/* This function is called when the module is removed. */
void simple_exit(void) {
    printk(KERN_INFO "Removing Module\n");
}

/* Macros for registering module entry and exit points. */
module_init( simple_init );
module_exit( simple_exit );

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simple Module");
MODULE_AUTHOR("SGG");
Run Code Online (Sandbox Code Playgroud)

我也将它Makefile放在与simple.c, …

c linux makefile compilation

5
推荐指数
1
解决办法
346
查看次数

g ++编译存在于另一个目录中的源文件

我正在尝试使用makefile设置一个构建过程,用于我正在处理的C++插件.我很想知道是否有办法在另一个目录中找到g ++编译文件.我这样做的动机是避免必须为每个源文件指定相对路径,如下所述.

我的项目目录结构如下:

MyPlugin --> src   --> Foo.cpp
                   --> Foo.h
                   --> Bar.cpp
                   --> Bar.cpp
         --> build --> Makefile
Run Code Online (Sandbox Code Playgroud)

以下是我当前Makefile的精简版:

SRC_PATH=../src
OUT_PATH=../bin
VPATH=${SRC_PATH}
FILES=Foo.cpp Bar.cpp

CC=g++
CFLAGS=-Wall -shared

all:
    mkdir -p ${OUT_PATH}
    ${CC} ${CFLAGS} -I${SRC_PATH} ${FILES} -o ${OUT_PATH}/MyPlugin.so
Run Code Online (Sandbox Code Playgroud)

通过这样做,我试图避免定义FILES变量如下:

FILES=../src/Foo.cpp ../src/Bar.cpp
Run Code Online (Sandbox Code Playgroud)

当我尝试运行时make all,g ++给了我一个错误.看起来通过-Iflag 指定的路径仅用于搜索#included文件.

g++: Foo.cpp: No such file or directory
g++: Bar.cpp: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我不能使用通配符(*.cpp)因为我并不总是希望拾取所有文件进行编译.另一种方法是cdsrc目录,提到这里,并从那里运行G ++,但只适用于我,如果所有文件在同一目录下(我需要的输出是一个单一的.so文件).我也试过设置环境变量PATH,但似乎没有任何影响. …

c++ gcc makefile g++

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

makefile ×3

c++ ×2

build ×1

build-automation ×1

c ×1

compilation ×1

g++ ×1

gcc ×1

linux ×1

scons ×1