2013-04-24 38 views
9

Tôi đang cố gắng để chạy mô-đun Python trong C++ sử dụng "#include <Python.h>", tuy nhiên, sau khi cài đặt "Bao gồm bổ sung Dependencies" của dự án để "\ include" Tôi nhận được lỗi sau khi debuging,Tại sao #include <Python.h> không hoạt động?

LINK : fatal error LNK1104: cannot open file 'python27_d.lib' 

Tôi đọc rằng tôi nên tải về phiên bản phát triển của Python, nhưng tôi không tìm thấy một liên kết cho điều đó, cộng với, tôi không chỉ cần tập tin 'python27_d.lib' được sao chép vào thư mục "libs"?

Xin lưu ý rằng tôi đang sử dụng phân phối Python của Anaconda.

Cảm ơn trước!

+0

Bạn có ý gì khi "chạy mô-đun Python trong C++"? Để làm điều đó, bạn phải [nhúng một trình thông dịch Python] (http://docs.python.org/2/extending/embedding.html). Chỉ cần làm '#include ' không làm điều đó. – abarnert

+1

Trong khi đó, bạn đã đọc [Xây dựng C và C++ Extensions trên Windows] (http://docs.python.org/2/extending/windows.html) và [Yêu cầu liên kết] (http://docs.python.org/ 2/extending/embedding.html # linking-requirements) (để nhúng)? Bạn có dự định nhúng thông dịch viên của bạn tĩnh hay động không? Bạn đã nhận được thông dịch viên bạn đang cố nhúng ở đâu? – abarnert

+0

Có lẽ dễ dàng hơn khi xây dựng các thư viện Python từ mã nguồn Python. – Aya

Trả lời

6

Tôi không biết nhiều về python, nhưng thông báo cho biết python27_d.lib không tồn tại hoặc ít nhất không tồn tại nơi mà trình liên kết đang tìm kiếm nó.

Bạn đã sửa trình biên dịch bao gồm vấn đề, bây giờ tìm tệp python27_d.lib với Windows Explorer và thêm đường dẫn đó vào đường dẫn Phụ thuộc thư viện bổ sung. Đó là dưới Cấu hình -> Trình liên kết -> Chung -> Thư mục Thư viện Bổ sung.

"_d" cho biết đó là thư viện gỡ lỗi, vì vậy bạn sẽ muốn thư viện đó cho cấu hình Gỡ lỗi của mình và cấu hình không có "_d" (có thể) cho cấu hình phát hành của bạn.

+0

Cảm ơn, vậy làm thế nào để tôi nhận được thư viện gỡ lỗi? – Curious

+0

Ahh, xin lỗi, nghĩ rằng đó chỉ là một vấn đề VS. Nhìn xung quanh nó xuất hiện rằng phiên bản phát hành (không có "_d") được phân phối, nhưng không phải là "_d". Mọi người đã tìm thấy một vài cách để giải quyết vấn đề tại đây: http://stackoverflow.com/questions/11311877/creating-a-dll-from-a-wrapped-cpp-file-with-swig –

+0

Tôi đã thử giải pháp "#define MS_NO_COREDLL "và nó có vẻ là làm việc nhờ một triệu :), nhưng tôi không thực sự hiểu tại sao – Curious

0

Bạn không nhất thiết phải sử dụng bản dựng gỡ lỗi Python ... [ngay cả khi bạn không sử dụng boost] Tôi sẽ xem tài liệu về boost.python nơi chúng có trình bao bọc cho Python.h xử lý tất cả các cửa sổ gỡ lỗi các vấn đề, để bạn có thể xây dựng một phần mở rộng gỡ lỗi chống lại một dll phát hành python.

http://www.boost.org/doc/libs/1_53_0/libs/python/doc/building.html#id19 Python Debugging xây dựng

0

Tôi chạy vào các lỗi tương tự khi cố gắng sử dụng Boost.Python để truy cập gói python Anaconda từ C++. Hãy để tôi bắt đầu bằng cách nói rằng ấn tượng cá nhân của tôi về các thư viện C++ Boost là chúng là một ý tưởng tuyệt vời với tài liệu không đầy đủ. Có rất nhiều tài liệu trên boost.org, nhưng nó luôn luôn dường như để lại các chi tiết quan trọng mà các tác giả xuất hiện để xem xét quá tầm thường để bận tâm đề cập đến. Nhưng, hãy để tôi lấy hộp xà phòng của mình ...

Động lực đang diễn ra cho tôi [hy vọng, cuối cùng] tìm ra cách để Boost.Python hoạt động trên hệ thống của tôi là có rất nhiều gói khoa học Python tuyệt vời [ SymPy, Numpy, SciPy, matplotlib, vv] được bao gồm trong phân phối Anaconda và nó thực sự là tuyệt vời để truy cập chúng từ các dự án C++ được xây dựng với Qt Creator. Và các tài liệu Boost dường như cho thấy rằng Boost.Python là nghĩa vụ phải làm điều đó cho tôi. Than ôi, những tài liệu đó dường như để lại các chi tiết quan trọng mà các tác giả dường như xem xét quá tầm thường để bận tâm đến việc ...

Dù sao, ban đầu, tôi gặp lỗi xây dựng cho thấy không tìm thấy python.h. Tôi đã thoát khỏi điều đó bằng cách thêm hai câu lệnh này vào tệp .pro dự án Qt Creator của tôi, mà nói qmake nơi Boost cài đặt bao gồm các file và nơi Anaconda cài đặt tập tin python.h của nó trên hệ thống của tôi:

INCLUDEPATH += C:\boost_1_55_0 
INCLUDEPATH += C:\Anaconda\include 

Sau đó , Tôi nhận được một lỗi LNK1104 chỉ ra rằng 'python27.lib' không thể được tìm thấy. Tôi đã loại bỏ điều đó bằng cách thêm hai câu lệnh này vào tệp .pro của tôi. Việc đầu tiên nói với qmake nơi để tìm tập tin python27.lib của Anaconda. Cái thứ hai nói với qmake nơi để tìm tăng.python binary:

LIBS += "C:/Anaconda/libs" 
LIBS += "C:/boost_1_55_0/stage/lib/libboost_python-vc110-mt-gd-1_55.lib" 

Nhưng, đó là như xa như tôi đã nhận được cho đến nay. Bây giờ tôi nhận được một lỗi cho thấy nó không thể mở tập tin 'C: /Anaconda/libs.obj' mà tôi chưa tìm thấy một sửa chữa cho. Lỗi, tất nhiên, là do tập tin đó không tồn tại. Thách thức là để khám phá lý do tại sao nó đang được tìm kiếm và nơi để tìm thấy nó.

3

Đặt studio trực quan ở chế độ phát hành thay vì gỡ lỗi.

+0

Đó thực sự là câu trả lời này kết hợp với câu trả lời ở trên đã giải quyết được vấn đề của tôi. Vì vậy, các bước là: (1) thiết lập để phát hành chế độ, không gỡ lỗi, (2) thiết lập các Linker để trỏ đến con đường Python của tôi. – rrs

19

Tôi thường phá vỡ điều này bằng cách sử dụng lib không gỡ lỗi Python trong các bản dựng gỡ lỗi. Thông thường, điều này dẫn đến mã như:

#ifdef _DEBUG 
    #undef _DEBUG 
    #include <Python.h> 
    #define _DEBUG 
#else 
    #include <Python.h> 
#endif 

nơi bạn ẩn định nghĩa của _DEBUG trong khi đưa vào Python.h.

+1

DOH! Đây là giải pháp! Chỉ cần đảm bảo rằng phiên bản gỡ lỗi của bạn liên kết với python27.lib thay vì python27_d.lib. –

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