main的多重定义

Posted

技术标签:

【中文标题】main的多重定义【英文标题】:multiple definition of main 【发布时间】:2014-03-25 09:37:18 【问题描述】:

我正在尝试创建 ./configure + make 集以使用 autotools 在以下结构中构建 C 代码。 drive.c 使用 mylib.c 中的函数

[mylib]
 +mylib.c
 +mylib.h
[src]
 +drive.c

更多细节在这里。

[mylib.c]

#include <stdio.h>
#include "mylib.h"

int main()
    mylib();
    return 0;

void
mylib(void)

  printf ("Hello world! I AM mylib \n");

[mylib.h]

void mylib(void);

[驱动器.c]

#include <mylib.h>

int
main (int argc, char **argv)

  mylib();
  return 0;

其实我已经给了main()mylib.cdrive.c

如果我在 CentOS 上 make 他们通常不会完成但是如果我在 MINGW 上 make 他们会显示错误消息 multiple definition ofmain'`

我如何在 MINGW 上 make 他们,即使他们有很多 main()

以下是自动工具的配置文件。

[配置文件.ac]

AC_PREREQ([2.69])
AC_INIT([libmylib], [1], [admin@localhost])
AC_CONFIG_SRCDIR([mylib/mylib.c])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([foreign])
LT_INIT
AC_PROG_CC
AC_CONFIG_FILES([mylib/Makefile
                 src/Makefile
                 Makefile])
AC_OUTPUT

[Makefile.am]

SUBDIRS = mylib src
ACLOCAL_AMFLAGS = -I m4

[Makefile.am@src]

bin_PROGRAMS = drive
drive_SOURCES = drive.c
LDADD = ../mylib/libmylib.la
AM_CPPFLAGS = -I../mylib

[Makefile.am@mylib]

lib_LTLIBRARIES = libmylib.la
libmylib_la_SOURCES = mylib.c
include_HEADERS = mylib.h

【问题讨论】:

拥有多个 main() 没有任何意义。你想通过多个它来解决什么问题? 如果有一些 C 代码可能是我制作的或某人制作的共享库。首先,我从原始文件中复制它,然后编辑它的源以删除 main 以避免多个 main。如果我可以编译多个 main(),我想我可以缩短这个过程。还要考虑调试场景,对某种库进行微小的测试更容易。如果它有 main(),我可以将它编译为可执行文件以进行小测试。测试后我可以将它编译为共享库。 如果我不能在 CentOS 上编译,我没有问过这个问题,我会放弃这个想法。但是我已经能够在 CentOS 上的多个 main 中编译。这就是为什么我想知道如何在 MINGW 上以相同的方式编译。 【参考方案1】:

您在混淆事物,拥有多个 main() 的想法从根本上是错误的。库从不包含 main() 函数。

(包含 DllMain 的 Windows DLL 除外,但这意味着不同。)

如果您想为您的库提供一个测试用例,请将测试用例作为一个包含该库的独立项目。测试代码不应在库本身中,main() 也不应。

另外,我非常怀疑您是否能够构建一个包含多个具有相同名称的函数定义的程序,无论是 main() 还是其他名称。如果您认为您已经做到了这一点,我会怀疑您没有正确链接文件,或者链接器是垃圾。

【讨论】:

以上是关于main的多重定义的主要内容,如果未能解决你的问题,请参考以下文章

main的多重定义

Linux自动化运维之Cobbler(自定义重装)

枚举的多重定义

在 Laravel Auth 中自定义重定向

spring-retry实现方法请求重试

编译时多重定义