2009-05-21 32 views
5

Tôi không chắc tại sao lại như vậy. Tôi đang phân phối một static * .lib trên nhiều dự án, nhưng lib tĩnh này tạo ra nhiều tệp * .obj. Có vẻ như tôi cũng cần phân phối các tệp * .obj đó với * .lib. Nếu không, tôi nhận được lỗi này:Tại sao tôi cần tệp * .obj khi liên kết tĩnh?

1>LINK : fatal error LNK1181: cannot open input file 'nsglCore.obj' 

Tại sao điều này? Có cách nào để đưa dữ liệu vào tệp * .obj trong tệp * .lib không? Có lẽ một chuyển đổi trong trình biên dịch?

Đây là cấu hình của tôi cho các thư viện tĩnh:

C/C++

/Od /GT /D "WIN32" /D "NDEBUG" /D "_LIB" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /MD /Yu"stdafx.hpp" /Fp"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\nsglCore-Win32-Release.pch" /Fo"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\\" /Fd"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\vc90-Release.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt 

Librarian

/OUT:"e:\Development\Projects\nsGameLib\Source\Core\Output\nsglCore-Win32-Release.lib" /NOLOGO /LTCG 

Đây là cấu hình của tôi cho dự án sử dụng thư viện tĩnh :

C/C++

/O2 /Oi /I "E:\Development\Projects\nsGameLib\Samples\\DummyEngine\\" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Fo"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\\" /Fd"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\vc90-Release.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt 

Linker

/OUT:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Output\SampleOnlyCore-Win32-Release.exe" /INCREMENTAL:NO /NOLOGO /LIBPATH:"E:\Development\Projects\nsGameLib\Samples\..\Deployment\Libraries" /MANIFEST /MANIFESTFILE:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\SampleOnlyCore-Win32-Release.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\SampleOnlyCore-Win32-Release.pdb" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /LTCG /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT nsglCore kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 

Trả lời

5

Tôi tin rằng đường linker của bạn không chính xác. Thư viện cần có hậu tố .lib trên đó. Vì vậy, nsglCore phải là nsglCore-Win32-Release.lib hoặc có thể là nsglCore-$(TargetPlatform)-$(ConfigurationName).lib hoặc bất kỳ việc mở rộng macro chính xác nào là.

+1

20 giây sau khi tôi phát hiện ra! Xem bài đăng của tôi. Nhưng, đây là câu trả lời;) – Veehmot

3

Ah ... Visual studio là quá thông minh cho bạn

Chuyển đến dự án bao gồm các lib, phải nhấp vào các thuộc tính

Thuộc tính cấu hình Goto | Linker

Gần cuối: Sử dụng Thư viện dependancy Đầu vào - Đặt Không

Đây là một lựa chọn Visual Studio để lấy các file .obj trực tiếp chứ không phải là file lib. Tôi tưởng tượng nó là để tránh các bước liên kết và do đó tăng tốc độ biên dịch.

Nói chung, bạn nên đặt dự án tạo tệp lib làm phụ thuộc của dự án sử dụng nó (trong thuộc tính chung trong cửa sổ thuộc tính). Sau đó bạn bật Link Library Dependancies. Điều này hoạt động tốt trong hầu hết các trường hợp.

+0

Tôi chưa thiết lập cài đặt này. – Veehmot

4

Nói chung, libs tĩnh làm không tạo tệp đối tượng. Những gì bạn làm là tạo các tệp đối tượng và đặt chúng trong một thư viện, sau đó trình liên kết sẽ tìm kiếm các tệp đối tượng trong các thư viện đó.

Tôi sẽ giải thích từ quan điểm dòng lệnh UNIXy vì đó là cách đơn giản hơn để hiểu (Tôi không biết ý kiến ​​của các dao phay VS trước khi thực hiện các công cụ cơ bản).

Một dòng lệnh mẫu cho việc tạo ra một thực thi là:

gcc -c -o prog.o prog.c 
gcc -o prog prog.o -L/libdir -lstdc 

Dòng đầu tiên chỉ đơn giản là tạo ra một đối tượng tập tin từ tập tin C của bạn.Dòng thứ hai tạo tệp thực thi bằng cách kéo các tệp đối tượng lại với nhau, thường theo một quy tắc được đặt như sau:

  • Tất cả các tệp được liệt kê rõ ràng được liên kết.
  • Khi đã xong, bạn tìm kiếm các thư viện cho các đối tượng khác đáp ứng các biểu tượng được tham chiếu nhưng không xác định.

Ví dụ: giả sử prog.c của bạn chứa dòng printf("hello\n");. Điều đó sẽ dẫn đến tệp prog.o của bạn chứa tham chiếu đến printf chưa được thỏa mãn.

Trình liên kết sẽ tìm kiếm các thư viện được chỉ định của bạn cho đến khi nó thỏa mãn tham chiếu đó. Trong trường hợp này nó sẽ tìm kiếm tất cả các file có dạng /libdir/libstdc.ext nơi:

  • /libdir là từ -L lựa chọn của bạn (một con đường để tìm kiếm các thư viện trong).
  • /lib là một hằng số.
  • stdc là tên của thư viện để tìm kiếm (từ -l).
  • ext là một hoặc nhiều tiện ích mở rộng (.a, .so, .sl, v.v.).

Sau khi tìm thấy biểu tượng, tệp đối tượng đó được liên kết để giải quyết. Điều này có thể dẫn đến nhiều hơn các biểu tượng không hài lòng xuất hiện như /libdir/libstdc.a(printf.o) có tham chiếu đến /libdir/libstdc.a(putch.o).

Sự cố cụ thể của bạn có thể do thực tế là bạn đang cố liên kết trực tiếp tệp đối tượng thay vì tìm kiếm trong thư viện. VS nên có tùy chọn dự án để chỉ định tệp đối tượng, đường dẫn tìm kiếm thư viện tên thư viện (Tôi không chắc chắn về điều này cho các phiên bản mới nhất nhưng tôi biết phiên bản trước của MSVC đã làm).

+0

Bài đăng hay. Nó có vẻ như một vấn đề cấu hình MSVC mặc dù. –

+0

Cảm ơn vì điều này, thông tin rất hữu ích, nhưng điều này không giải quyết được vấn đề của tôi. Tôi muốn biết cách tránh sự phụ thuộc * .obj. – Veehmot

Các vấn đề liên quan