none
VS2010中的靜態編譯問題 RRS feed

  • 问题

  • 本人C/C++初學者。最近在研究sdl,在項目編譯時遇到了一些問題。

    我希望編譯出的exe在運行時能不依賴dll文件,所以選擇了靜態編譯。嘗試過“在靜態庫中使用MFC”以及“多線程/MT”選項,編譯時會出現重定義的錯誤,於是又添加“/FORCE:MULTIPLE”,生成了exe,但是出現這一條消息 “LINK : warning LNK4044: 无法识别的选项“/MT”;已忽略”(不能靜態編譯???),exe文件仍然無法正常運行。

    聯繫項目原作者,被告知“配置屬性”需改成“靜態庫.lib”(如下圖),但這樣以後生成的是.lib文件,沒有可執行文件.exe。

    請問我該怎麼辦?

    2011年9月7日 16:54

答案

  • 我想工程的作者,是让你把该exe所加载的dll工程改为静态链接工程。而不是将这个exe修改成静态库。。。

     


    麻烦把正确答案设为解答。


    同意!

    如果目标生成的是x.dll,那么还会附带生成一个x.lib,这时这个x.lib称为"输入库(Import library)",输入库x.lib中只有一些导出函数的地址信息,没有实际的函数执行体(指令部分),在你link到一个这样的x.lib时,无论如何,都依赖于x.dll

     

    如果目标生成的是x.lib,这时,并没有一个相应的x.dll生成,这时x.lib是真正的"静态库(Static library)",静态库x.lib中有实际的函数执行体,在你link到这种x.lib时,不依赖于x.dll,linker会把相应的函数执行体直接生成到exe里

     

    所以同意楼上意见,原作者的意思是,把你引用的那个dll的工程的配置类型改为静态库

    • 已标记为答案 Rob Pan 2011年9月16日 7:47
    2011年9月8日 12:16
  • 如果你没有SDL那个工程的源代码,或者原作者没给你静态库的sdl.lib,那你只能依赖那个sdl.dll

    • 已标记为答案 Rob Pan 2011年9月16日 7:47
    2011年9月9日 3:28

全部回复

  • 自己頂一下

    大家幫忙看一下啊

    2011年9月8日 3:58
  • 我想工程的作者,是让你把该exe所加载的dll工程改为静态链接工程。而不是将这个exe修改成静态库。。。

     


    麻烦把正确答案设为解答。
    2011年9月8日 9:41
    版主
  • 我想工程的作者,是让你把该exe所加载的dll工程改为静态链接工程。而不是将这个exe修改成静态库。。。

     


    麻烦把正确答案设为解答。


    同意!

    如果目标生成的是x.dll,那么还会附带生成一个x.lib,这时这个x.lib称为"输入库(Import library)",输入库x.lib中只有一些导出函数的地址信息,没有实际的函数执行体(指令部分),在你link到一个这样的x.lib时,无论如何,都依赖于x.dll

     

    如果目标生成的是x.lib,这时,并没有一个相应的x.dll生成,这时x.lib是真正的"静态库(Static library)",静态库x.lib中有实际的函数执行体,在你link到这种x.lib时,不依赖于x.dll,linker会把相应的函数执行体直接生成到exe里

     

    所以同意楼上意见,原作者的意思是,把你引用的那个dll的工程的配置类型改为静态库

    • 已标记为答案 Rob Pan 2011年9月16日 7:47
    2011年9月8日 12:16
  • 我覺得你們說得對,但是我仍然不知道怎麼設定。我的介面如下圖:

    這個工程是打開下圖這個文件時看到的:

    我猜你們說的引用的那個dll應該是至SDL.dll什麽的,但是我不知道引用的這個工程在哪。我只知道這個dll的具體路徑。是否應該用VS打開這個dll然後改配置屬性什麽的。

    本人小白一個請見諒!

    2011年9月8日 15:25
  • 另外原作者給我的提示如下圖(他這裡是SDL的屬性頁面,而我的是sdlpal的屬性頁面)

     

    2011年9月8日 15:28
  • 如果你没有SDL那个工程的源代码,或者原作者没给你静态库的sdl.lib,那你只能依赖那个sdl.dll

    • 已标记为答案 Rob Pan 2011年9月16日 7:47
    2011年9月9日 3:28
  • 非常感謝各位!!!我想我明白你們的意思了。SDL是開源的,所以代碼我下載到了,並且靜態編譯得到了sdl.lib(比之前那個大很多),我想應該是真正的靜態庫了吧?而不是dll附帶的輸入庫。

    不過依賴這個lib文件編譯sdlpal這個工程的時候,出現一堆錯誤,糾結:

    1>sdl.lib(SDL_dx5video.obj) : error LNK2001: 无法解析的外部符号 _GUID_POV

    1>sdl.lib(SDL_dx5video.obj) : error LNK2001: 无法解析的外部符号 _GUID_Slider

    1>sdl.lib(SDL_dx5video.obj) : error LNK2001: 无法解析的外部符号 _GUID_RzAxis

    1>sdl.lib(SDL_dx5video.obj) : error LNK2001: 无法解析的外部符号 _GUID_RyAxis

    1>sdl.lib(SDL_dx5video.obj) : error LNK2001: 无法解析的外部符号 _GUID_RxAxis

    1>sdl.lib(SDL_dx5video.obj) : error LNK2001: 无法解析的外部符号 _GUID_ZAxis

    1>sdl.lib(SDL_dx5video.obj) : error LNK2001: 无法解析的外部符号 _GUID_YAxis

    1>sdl.lib(SDL_dx5video.obj) : error LNK2001: 无法解析的外部符号 _GUID_XAxis

    1>sdl.lib(SDL_dx5video.obj) : error LNK2001: 无法解析的外部符号 _GUID_Key

    1>sdl.lib(SDL_dx5video.obj) : error LNK2001: 无法解析的外部符号 _IID_IDirectDrawSurface3

    1>sdl.lib(SDL_dx5yuv.obj) : error LNK2001: 无法解析的外部符号 _IID_IDirectDrawSurface3

    1>sdl.lib(SDL_dx5video.obj) : error LNK2001: 无法解析的外部符号 _IID_IDirectDraw2

    1>sdl.lib(SDL_dx5video.obj) : error LNK2001: 无法解析的外部符号 _IID_IDirectDrawGammaControl

    1>sdl.lib(SDL_dx5events.obj) : error LNK2001: 无法解析的外部符号 _GUID_SysMouse

    1>sdl.lib(SDL_dx5events.obj) : error LNK2001: 无法解析的外部符号 _GUID_SysKeyboard

    1>sdl.lib(SDL_dx5events.obj) : error LNK2001: 无法解析的外部符号 _IID_IDirectInputDevice2A

    1>.\Release\sdlpal.exe : fatal error LNK1120: 15 个无法解析的外部命令

    2011年9月9日 14:48
  • 这是SDL静态库在编译的时候链接的一些符号,你还缺链接库


    0xBAADF00D
    2011年9月9日 15:51
    版主
  • 这是SDL静态库在编译的时候链接的一些符号,你还缺链接库


    0xBAADF00D
    是說還需要sdl.dll嗎?編譯出應該放到什麽目錄?Win7x64
    2011年9月9日 16:07
  • 以_GUID_POV这个为例,在SDL的工程中去搜索一下,看看_GUID_POV在什么地方定义的?
    2011年9月13日 1:27