2012-11-13 26 views
5

Tôi đang cố xây dựng một thư viện dùng chung từ các đối tượng gcc và gfortran bằng SCons và MinGW trên Windows, nhưng trong liên kết cuối cùng dòng lệnh quá dài, vượt quá 18000 ký tự. Tôi biết tôi cần phải sử dụng một tempfile (tập tin phản ứng?) Để vượt qua dòng lệnh, nhưng tôi không thể tìm thấy một cách để có được SCons để làm điều này trực tiếp. Tôi đã sử dụng CMake cho thư viện này và nó xử lý tệp phản hồi mà không có sự can thiệp của tôi.Lệnh dài dòng SCP TEMPFILE với MinGW

Bàn phím dường như đang sử dụng CommandGeneratorAction để tạo dòng lệnh thư viện được chia sẻ. Có cách nào để nói hành động này sử dụng cơ chế tệp phản hồi không? Có phương pháp nào khác để xử lý các dòng lệnh dài mà tôi đang xem không?

SConscript liên quan:

sqllib = env.SharedLibrary(target='fvssql', source=sqllib_sources, LIBS=['odbc32',]) 
ffelib = env.SharedLibrary(target='fvspncffe', source=ffelib_sources, LIBS=[sqllib,], LIBPATH=['.',]) 

fvsobjs = env.SharedObject(fvslib_sources) 
fvsobjs = [obj for obj in fvsobjs if obj.get_suffix()=='.o'] 

fvslib = env.SharedLibrary(target='fvspnc', source=fvsobjs, LIBS=sqllib+ffelib, LIBPATH=['.',]) 

đầu ra có liên quan từ env.Dump():

'SHLIBSUFFIX': '.dll', 
'SHLINK': '$LINK', 
'SHLINKCOM': <SCons.Action.CommandGeneratorAction object at 0x02DDF770>, 
'SHLINKFLAGS': ['$LINKFLAGS', '-shared'], 

tôi có thể chuẩn bị các mẫu dòng lệnh trong môi trường của tôi env['SHLINKCOM']="${TEMPFILE('$SHLINK -o $TARGET ... $SOURCE')}", nhưng điều này dường như mong manh và tôi muốn thích để cho SCons xử lý nó nếu có thể.

Tôi đã thử sử dụng thay thế chuỗi env['SHLINKCOM']='${TEMPFILE("%s")}' % (env['SHLINKCOM'],), nhưng kết quả là dòng lệnh chưa hoàn tất và bây giờ là tệp phản hồi.

EDIT

Tôi đã thấy các LongCmdLinesOnWin32 workaround. Tôi muốn sử dụng TEMPFILE, TempFileMunge, cơ chế chỉ huy dòng lệnh nếu có thể.

Trả lời

1

Bạn đã xem http://scons.org/wiki/LongCmdLinesOnWin32 chưa? Dường như có một câu trả lời cho vấn đề chính xác của bạn với lệnh ling dài trong giai đoạn liên kết.

+0

Tôi đã thấy cách giải quyết này. Tuy nhiên, [giải pháp] này (http://scons.org/wiki/LongCmdLinesOnWin32?action=recall&rev=1) hiện là 8 tuổi. Dường như SCons đã phát triển để sử dụng cơ chế indirection tempfile kể từ đó. Nếu tôi không thể sử dụng thích hợp tempfile thì tôi sẽ thử cách này. – tharen

+0

Nhận xét cuối cùng là khá gần đây. Dù sao, nếu bạn sẽ tìm thấy một cách tốt hơn, một miếng vá luôn được đánh giá cao. http://scons.org/wiki/LongCmdLinesOnWin32?action=diff&rev1=40&rev2=41 –

+0

Lưu ý có vấn đề với [LongCmdLinesOnWin32] (http://scons.org/wiki/LongCmdLinesOnWin32). Nó cần phải được mở rộng để xử lý các tên đường dẫn với các dấu ngoặc nhúng (được thêm vào các không gian xử lý trong một môi trường Cygwin) nhưng hơn nữa, dường như có một số vấn đề với studio trực quan. Dường như môi trường VS cài đặt phiên bản SPAWN của riêng nó, khởi động lên trình bao dòng lệnh MSVC (do đó thiết lập các giá trị env. Cần thiết), làm cho các biên dịch sử dụng 'cl' thành không thành công. – TheDuke

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