2009-07-13 25 views
6

Tôi đang làm việc với OpenCV và tôi muốn đặt toàn bộ thư viện vào bên trong không gian tên riêng của nó. Tôi đã xem xét một chút nhưng chưa tìm thấy câu trả lời ...Bạn có thể đặt một thư viện bên trong một không gian tên không?

Bạn có thể thực hiện việc này mà không sửa đổi mã nguồn của thư viện không? Nếu sau đó như thế nào?

+0

Tôi vừa xem trang web OpenCV. Có vẻ như tất cả các chức năng đều có tiền tố là "cv". Trong khi các không gian tên là một giải pháp tốt hơn, tôi tự hỏi, bạn đang có những va chạm biểu tượng thực sự? –

+0

Tôi không có xung đột thực sự, nó chỉ là để giữ cho mọi thứ được tổ chức như tôi đang làm wrapper của một số cấu trúc dữ liệu openCV và muốn đặt chúng trong cùng một không gian tên. –

Trả lời

7

Về cơ bản không. Bạn có thể cố gắng làm điều đó bằng cách viết trình bao bọc và macro, nhưng nó sẽ không hoạt động. Nếu bạn thực sự cần phải làm điều này, một cách tiếp cận tốt hơn là ngã ba thư viện và thực hiện các bổ sung không gian tên cần thiết. Tất nhiên, bạn sẽ thực sự cần phải làm điều đó để có cách tiếp cận này, và tôi nghi ngờ bạn không.

+0

Chết tiệt ........ –

+0

Được chấp nhận bởi vì nó là thẳng đến điểm –

+0

Và lời khuyên khôn ngoan nhất, chắc chắn? –

4

Bạn có thể viết một chương trình phân tích biểu tượng xuất khẩu của thư viện và thay đổi tên của các biểu tượng ở đó. Bạn vẫn cần phải thay đổi các tiêu đề của khóa học.

Điều đó nói rằng sẽ dễ dàng hơn khi viết một kịch bản đơn giản để thêm các thẻ tên miền và biên dịch lại thư viện.

+8

Tôi đã làm điều đó một lần để giải quyết các xung đột về tên xấu xí trong thư viện của bên thứ ba. Lời khuyên mạnh mẽ của tôi là: ** không **! Thật kinh khủng. –

+0

Cảm ơn Konrad từ lời khuyên! –

+0

hoặc bạn chỉ có thể sử dụng objcopy có khả năng thay đổi biểu tượng :-P. –

2

Bạn có thể cung cấp tệp tiêu đề trình bao bọc khai báo cùng một giao diện bên trong không gian tên. Trong tệp nguồn trình bao bọc của bạn, bao gồm tiêu đề cho thư viện và gọi vào thư viện đó. Không có nguồn nào bên ngoài nguồn của bạn cần biết về các ký hiệu của thư viện. Nếu bạn muốn thực sự cẩn thận, bạn có thể đặt tất cả bên trong thư viện được nạp động.

Điều rất phổ biến là làm điều này với COM để ẩn phụ thuộc của trình liên kết của một số thư viện. Không thể thấy tại sao bạn không thể làm điều đó với C++.

3

Câu trả lời chung là bạn không thể, nhưng có một vài thủ thuật bạn có thể làm.

Ví dụ, objcopy từ binutils có khả năng sao chép một đối tượng, nhưng đặt một tiền tố trên tất cả các biểu tượng bằng cách sử dụng các --prefix-ký cờ. tiền tố thứ thường là không gian tên của người nghèo và là một cách "ok" để tránh xung đột.

Cách sử dụng khá đơn giản, một cái gì đó như thế này:

objcopy --prefix-symbols "__mylib_" object.o new_object.o 

LƯU Ý: có, nó không làm việc với .so tập tin quá.

CHÚ Ý 2: điều này sẽ hoàn toàn phá vỡ tên xén mang tên C++, vì vậy, chỉ thử trên thư viện có API kiểu C. Vì bạn đang nói về việc thêm một không gian tên nơi không có, tôi cho rằng đây là trường hợp.

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