【问题标题】:Link an .obj or .lib to a pre-existing executable将 .obj 或 .lib 链接到预先存在的可执行文件
【发布时间】:2011-02-17 22:39:39
【问题描述】:

我有一个预先存在的可执行文件,但我没有源代码,它想要与我确实有源代码的目标文件或静态库 (C++) 链接。我正在使用 Visual Studio 8.0。

关于这个问题的第一件事,请不要问我为什么需要这样做。我只是想知道怎么做(我很确定可以做到)。

我尝试将“myprogram.exe”可执行文件添加到“附加依赖项”C++ 链接器项目属性中。这会产生以下链接器命令行选项:

/OUT:"C:\Users\me\Documents\Visual Studio 2008\Projects\SampleCppLibrary\Debug\SampleCppLibrary.lib" /NOLOGO myprogram.exe

当我构建项目时,我得到了这个错误:

Error 1 fatal error LNK1107: invalid or corrupt file: cannot read at 0x268 c:\Users\me\Documents\Visual Studio 2008\Projects\SampleCppLibrary\SampleCppLibrary\myprogram.exe 1 SampleCppLibrary

我认为尝试创建一个链接了可执行文件的 .lib 可能本质上是错误的。所以我把项目类型改成了exe,我故意不给它一个主入口点。相反,我给了它:

extern int _tmain(int argc, _TCHAR* argv[]);

我希望预先存在的可执行文件中的入口点可以填补链接器的空白。不幸的是,错误保持不变。这个概念有问题吗(我已经知道这很奇怪)?或者我可能需要设置额外的标志来指示所链接的 exe 的性质?

【问题讨论】:

    标签: c++ visual-studio linker


    【解决方案1】:

    您不能将可执行文件作为对象链接 - 主要是因为您只能拥有一个主文件。

    您可能想要做的是将现有可执行文件作为函数从新应用中的 system() 或 popen() 调用中调用。

    编辑:如果你真的需要提供一个“exe”,我之前已经包含了一个帮助程序作为二进制资源(即像一个图标)让调用者将它写入 %temp%,执行它并删除它!甚至还有一些 API 可以创建其他用户看不到的临时文件。

    【讨论】:

    • 很遗憾,我做不到。我需要为现有的可执行文件添加一个新的入口点——这样当工作完成时仍然只有一个文件。入口点甚至不需要调用可执行文件的任何部分(我知道这让我的请求变得更加奇怪,但请接受它)。
    • 没有使用十六进制编辑器在其中进行修改以删除 exe 标头并插入一个 lib 我不知道您如何做到这一点。我不知道 exe 格式在 win32 上的记录如何
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多